Changeset 992 for trunk/test_more


Ignore:
Timestamp:
Oct 2, 2007 9:58:50 AM (13 years ago)
Author:
bradbell
Message:

trunk: Extend pow function to work for double, AD<Base> with any Base.

whats_new_07.omh: user's view of the changes.
pow.cpp: test of use of pow( AD< AD<double> > , double ).
base_complex.hpp: correction of minor typo.
pow.hpp: extend to work with AD<Base> and double.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/test_more/pow.cpp

    r976 r992  
    349349        return ok;     
    350350}
     351bool PowTestSix(void)
     352{       bool ok = true;
     353
     354        using CppAD::AD;
     355        using CppAD::NearEqual;
     356
     357        // domain space vector
     358        size_t n  = 1;
     359        double x0 = 1.5;
     360        CPPAD_TEST_VECTOR< AD<double> > x(n);
     361        x[0]      = x0;
     362
     363        // domain space vector
     364        CPPAD_TEST_VECTOR< AD< AD<double> > > X(n);
     365        X[0]      = x[0];
     366
     367        // declare independent variables and start tape recording
     368        CppAD::Independent(X);
     369
     370        // range space vector
     371        size_t m = 1;
     372        CPPAD_TEST_VECTOR< AD< AD<double> > > Y(m);
     373
     374        // case of AD< AD<double> > raised to a double power
     375        double e = 2.5;
     376        Y[0] = pow(X[0], e);
     377
     378        // create F: X -> Y and stop tape recording
     379        CppAD::ADFun< AD<double> > F(X, Y);
     380
     381        // check function value
     382        ok  &= (Value( Value(Y[0]) ) == pow(x0, e) );
     383
     384        // forward computation of first partial w.r.t. x[1]
     385        double d1 = e * pow(x0, (e-1));
     386        CPPAD_TEST_VECTOR< AD<double> > dx(n);
     387        CPPAD_TEST_VECTOR< AD<double> > dy(m);
     388        dx[0] = 1.;
     389        dy    = F.Forward(1, dx);
     390        ok   &= NearEqual(dy[0], d1, 1e-10, 1e-10);
     391
     392        // reverse mode computation of second partials
     393        // x.r.t. x[1],x[0]  and x[1], x[1]
     394        double d2 = e * (e-1) * pow(x0, (e-2));
     395        CPPAD_TEST_VECTOR< AD<double> >   w(m);
     396        CPPAD_TEST_VECTOR< AD<double> > ddw(2*n);
     397        w[0] = 1.;
     398        ddw  = F.Reverse(2, w);
     399        ok  &= NearEqual(ddw[0], d1, 1e-10, 1e-10);
     400        ok  &= NearEqual(ddw[1], d2, 1e-10, 1e-10);
     401
     402        return ok;     
     403}
    351404
    352405} // END empty namespace
     
    359412        ok     &= PowTestFour();
    360413        ok     &= PowTestFive();
     414        ok     &= PowTestSix();
    361415        return ok;
    362416}
Note: See TracChangeset for help on using the changeset viewer.