source: trunk/test_more/ode_err_control.cpp @ 620

Last change on this file since 620 was 620, checked in by bradbell, 14 years ago

move test_more/*.cpp to lower case file names

File size: 2.6 KB
Line 
1// BEGIN SHORT COPYRIGHT
2/* --------------------------------------------------------------------------
3CppAD: C++ Algorithmic Differentiation: Copyright (C) 2003-06 Bradley M. Bell
4
5CppAD is distributed under multiple licenses. This distribution is under
6the terms of the
7                    Common Public License Version 1.0.
8
9A copy of this license is included in the COPYING file of this distribution.
10Please visit http://www.coin-or.org/CppAD/ for information on other licenses.
11-------------------------------------------------------------------------- */
12// END SHORT COPYRIGHT
13
14/*
15Test relative error with zero initial conditions.
16(Uses minimum step size to integrate).
17*/
18// BEGIN PROGRAM
19
20# include <cstddef>                 // for size_t
21# include <CppAD/OdeErrControl.h>   // CppAD::OdeErrControl
22# include <CppAD/NearEqual.h>       // CppAD::NearEqual
23# include <CppAD/CppAD_vector.h>    // CppAD::vector
24# include <CppAD/Runge45.h>         // CppAD::Runge45
25
26namespace {
27        // --------------------------------------------------------------
28        class Fun {
29        private:
30                 size_t n;   // dimension of the state space
31        public:
32                // constructor
33                Fun(size_t n_) : n(n_)
34                { } 
35
36                // given x(0) = 0
37                // solution is x_i (t) = t^(i+1)
38                void Ode(
39                        const double                &t, 
40                        const CppAD::vector<double> &x, 
41                        CppAD::vector<double>       &f)
42                {       size_t i;
43                        f[0] = 1.;
44                        for(i = 1; i < n; i++)
45                                f[i] = (i+1) * x[i-1];
46                }
47        };
48
49        // --------------------------------------------------------------
50        class Method {
51        private:
52                Fun F;
53        public:
54                // constructor
55                Method(size_t n_) : F(n_)
56                { }
57                void step(
58                        double ta, 
59                        double tb, 
60                        CppAD::vector<double> &xa ,
61                        CppAD::vector<double> &xb ,
62                        CppAD::vector<double> &eb )
63                {       xb = CppAD::Runge45(F, 1, ta, tb, xa, eb);
64                }
65                size_t order(void)
66                {       return 4; }
67        };
68}
69
70bool OdeErrControl(void)
71{       bool   ok = true;     // initial return value
72
73        // Runge45 should yield exact results for x_i (t) = t^(i+1), i < 4
74        size_t  n = 6;       
75       
76        // construct method for n component solution
77        Method method(n);
78
79        // inputs to OdeErrControl
80
81        double ti   = 0.;
82        double tf   = .9;
83        double smin = 1e-2;
84        double smax = 1.;
85        double scur = .5;
86        double erel = 1e-7;
87
88        CppAD::vector<double> xi(n);
89        CppAD::vector<double> eabs(n);
90        size_t i;
91        for(i = 0; i < n; i++)
92        {       xi[i]   = 0.;
93                eabs[i] = 0.;
94        }
95
96        // outputs from OdeErrControl
97
98        CppAD::vector<double> ef(n);
99        CppAD::vector<double> xf(n);
100       
101        xf = OdeErrControl(method,
102                ti, tf, xi, smin, smax, scur, eabs, erel, ef);
103
104        double check = 1.;
105        for(i = 0; i < n; i++)
106        {       check *= tf;
107                ok &= CppAD::NearEqual(check, xf[i], erel, 0.);
108        }
109
110        return ok;
111}
112
113// END PROGRAM
Note: See TracBrowser for help on using the repository browser.