Prev Next test_circle_implicit_kedem Headings

@(@\newcommand{\B}[1]{{\bf #1}} \newcommand{\R}[1]{{\rm #1}}@)@
Example / Test of Implicit Wagner Class
//
// simple implicit function y(x) defined by
// 0 = L(x, y) = x^2  + y(x)^2  - 1
//
class kedem_circle {
public:
     kedem_circle(void)
     { }
     VECTOR(double) function(const VECTOR(double)& x)
     {    assert( x.size() == 1 );
          VECTOR(double) y(1);
          y[0] = sqrt( 1.0 - x[0] * x[0] );
          return y;
     }
     VECTOR(double) derivative(const VECTOR(double)& x, const VECTOR(double)& y)
     {    // b = L_y (x, y)
          VECTOR(double) b(1);
          b[0] = 2.0 * y[0];
          return b;
     }
     VECTOR(double) linear(const VECTOR(double)& b, const VECTOR(double)& v)
     {    VECTOR(double) u(1);
          assert( v.size() == 1 );
          u[0] = v[0] / b[0];
          return u;
     }
};
bool test_cricle_implicit_kedem(void)
{    bool ok = true;
     double eps99 = 99.0 * std::numeric_limits<double>::epsilon();

     // record z = L(x, y)
     VECTOR( CppAD::AD<double> ) axy(2), az(1);
     axy[0] = 0.5;
     axy[1] = 0.5;
     CppAD::Independent( axy );
     az[0] = axy[0] * axy[0] + axy[1] * axy[1] - 1.0;
     CppAD::ADFun<double> L_fun(axy, az);

     // record F(x, y) = y
     CppAD::Independent( axy );
     az[0] = axy[1];
     CppAD::ADFun<double> F_fun(axy, az);

     // solver used by kedem_ad object
     kedem_circle solve;

     // create implicit function object
     implicit_kedem<kedem_circle> kedem_ad(L_fun, F_fun, solve);

     // Taylor coefficient vectors
     VECTOR(double) xk(1), yk(1);

     // zero order, y(t) = sqrt(1 - x(t) * x(t) )
     size_t k  = 0;
     double x0 = 0.5;
     xk[0]     = x0;
     bool store = true;
     yk         = kedem_ad.Forward(k, xk, store);
     double y0 = sqrt(1.0 - x0 * x0);
     ok       &= CppAD::NearEqual(yk[0], y0, eps99, eps99);

     // first order, y'(t) = - x(t) * x'(t) / sqrt(r0 - x(t) * x(t) )
     k         = 1;
     double x1 = 0.75;
     xk[0]     = x1;
     store     = true;
     yk        = kedem_ad.Forward(k, xk, store);
     double y1 = - x0 * x1 / y0;
     ok       &= CppAD::NearEqual(yk[0], y1, eps99, eps99);

     // second order
     // y''(t) = - x'(t) * x'(t) / sqrt(r0 - x(t) * x(t) )
     //          - x(t) * x''(t) / sqrt(r0 - x(t) * x(t) )
     //          - (x(t) * x'(t))^2  / sqrt(r0 - x(t) * x(t) )^3
     k         = 2;
     double x2 = 0.25;
     xk[0]     = x2;
     store     = false;
     yk        = kedem_ad.Forward(k, xk, false);
     double y2 = - x1 * x1 / (2.0 * y0);
     y2       -= x0 * x2 / y0;
     y2       -= (x0 * x1) * (x0 * x1) / (2.0 * y0 * y0 * y0);
     ok       &= CppAD::NearEqual(yk[0], y2, eps99, eps99);
     //
     return ok;
}

Input File: src/implicit_kedem.cpp