Path: blob/devel/ElmerGUI/netgen/libsrc/linalg/polynomial.cpp
3206 views
#include <mystdlib.h>1#include <linalg.hpp>23namespace netgen4{56QuadraticPolynomial1V ::7QuadraticPolynomial1V (double ac, double acx, double acxx)8{9c = ac;10cx = acx;11cxx = acxx;12}1314double QuadraticPolynomial1V ::15Value (double x)16{17return c + cx * x + cxx * x * x;18}1920double QuadraticPolynomial1V :: MaxUnitInterval ()21{22// inner max23if (cxx < 0 && cx > 0 && cx < -2 * cxx)24{25return c - 0.25 * cx * cx / cxx;26}272829if (cx + cxx > 0) // right edge30return c + cx + cxx;3132// left end33return c;34}3536373839LinearPolynomial2V ::40LinearPolynomial2V (double ac, double acx, double acy)41{42c = ac;43cx = acx;44cy = acy;45};464748QuadraticPolynomial2V ::49QuadraticPolynomial2V ()50{51;52}535455QuadraticPolynomial2V ::56QuadraticPolynomial2V (double ac, double acx, double acy,57double acxx, double acxy, double acyy)58{59c = ac;60cx = acx;61cy = acy;62cxx = acxx;63cxy = acxy;64cyy = acyy;65}6667void QuadraticPolynomial2V ::68Square (const LinearPolynomial2V & lp)69{70c = lp.c * lp.c;71cx = 2 * lp.c * lp.cx;72cy = 2 * lp.c * lp.cy;7374cxx = lp.cx * lp.cx;75cxy = 2 * lp.cx * lp.cy;76cyy = lp.cy * lp.cy;77}7879void QuadraticPolynomial2V ::80Add (double lam, const QuadraticPolynomial2V & qp2)81{82c += lam * qp2.c;83cx += lam * qp2.cx;84cy += lam * qp2.cy;85cxx += lam * qp2.cxx;86cxy += lam * qp2.cxy;87cyy += lam * qp2.cyy;88}8990double QuadraticPolynomial2V ::91Value (double x, double y)92{93return c + cx * x + cy * y + cxx * x * x + cxy * x * y + cyy * y * y;94}9596/*97double QuadraticPolynomial2V ::98MinUnitSquare ()99{100double x, y;101double minv = 1e8;102double val;103for (x = 0; x <= 1; x += 0.1)104for (y = 0; y <= 1; y += 0.1)105{106val = Value (x, y);107if (val < minv)108minv = val;109}110return minv;111};112*/113114double QuadraticPolynomial2V ::115MaxUnitSquare ()116{117// find critical point118119double maxv = c;120double hv;121122double det, x0, y0;123det = 4 * cxx * cyy - cxy * cxy;124125if (det > 0)126{127// definite surface128129x0 = (-2 * cyy * cx + cxy * cy) / det;130y0 = (cxy * cx -2 * cxx * cy) / det;131132if (x0 >= 0 && x0 <= 1 && y0 >= 0 && y0 <= 1)133{134hv = Value (x0, y0);135if (hv > maxv) maxv = hv;136}137}138139QuadraticPolynomial1V e1(c, cx, cxx);140QuadraticPolynomial1V e2(c, cy, cyy);141QuadraticPolynomial1V e3(c+cy+cyy, cx+cxy, cxx);142QuadraticPolynomial1V e4(c+cx+cxx, cy+cxy, cyy);143144hv = e1.MaxUnitInterval();145if (hv > maxv) maxv = hv;146hv = e2.MaxUnitInterval();147if (hv > maxv) maxv = hv;148hv = e3.MaxUnitInterval();149if (hv > maxv) maxv = hv;150hv = e4.MaxUnitInterval();151if (hv > maxv) maxv = hv;152153return maxv;154155// (*testout) << "maxv = " << maxv << " =~= ";156157/*158double x, y;159maxv = -1e8;160double val;161for (x = 0; x <= 1.01; x += 0.1)162for (y = 0; y <= 1.01; y += 0.1)163{164val = Value (x, y);165if (val > maxv)166maxv = val;167}168169// (*testout) << maxv << endl;170return maxv;171*/172};173174175176177double QuadraticPolynomial2V ::178MaxUnitTriangle ()179{180// find critical point181182double maxv = c;183double hv;184185double det, x0, y0;186det = 4 * cxx * cyy - cxy * cxy;187188if (cxx < 0 && det > 0)189{190// definite surface191192x0 = (-2 * cyy * cx + cxy * cy) / det;193y0 = (cxy * cx -2 * cxx * cy) / det;194195if (x0 >= 0 && y0 >= 0 && x0+y0 <= 1)196{197return Value (x0, y0);198}199}200201202QuadraticPolynomial1V e1(c, cx, cxx);203QuadraticPolynomial1V e2(c, cy, cyy);204QuadraticPolynomial1V e3(c+cy+cyy, cx-cy+cxy-2*cyy, cxx-cxy+cyy);205206hv = e1.MaxUnitInterval();207if (hv > maxv) maxv = hv;208hv = e2.MaxUnitInterval();209if (hv > maxv) maxv = hv;210hv = e3.MaxUnitInterval();211if (hv > maxv) maxv = hv;212213return maxv;214}215}216217218