Prev Next

@(@\newcommand{\W}[1]{ \; #1 \; } \newcommand{\R}[1]{ {\rm #1} } \newcommand{\B}[1]{ {\bf #1} } \newcommand{\D}[2]{ \frac{\partial #1}{\partial #2} } \newcommand{\DD}[3]{ \frac{\partial^2 #1}{\partial #2 \partial #3} } \newcommand{\Dpow}[2]{ \frac{\partial^{#1}}{\partial {#2}^{#1}} } \newcommand{\dpow}[2]{ \frac{ {\rm d}^{#1}}{{\rm d}\, {#2}^{#1}} }@)@
Evaluate a Function Defined in Terms of an ODE

# include <cppad/speed/ode_evaluate.hpp>

This routine evaluates a function @(@ f : \B{R}^n \rightarrow \B{R}^n @)@ defined by @[@ f(x) = y(x, 1) @]@ where @(@ y(x, t) @)@ solves the ordinary differential equation @[@ \begin{array}{rcl} y(x, 0) & = & x \\ \partial_t y (x, t ) & = & g[ y(x,t) , t ] \end{array} @]@ where @(@ g : \B{R}^n \times \B{R} \rightarrow \B{R}^n @)@ is an unspecified function.

The template function ode_evaluate is defined in the CppAD namespace by including the file cppad/speed/ode_evaluate.hpp (relative to the CppAD distribution directory).


Operation Sequence
The type Float must be a NumericType . The Float operation sequence for this routine does not depend on the value of the argument x , hence it does not need to be retaped for each value of @(@ x @)@.

If y and z are Float objects, the syntax
y = fabs(z)
must be supported. Note that it does not matter if the operation sequence for fabs depends on z because the corresponding results are not actually used by ode_evaluate; see fabs in Runge45 .

The argument x has prototype
     const CppAD::vector<
Float>& x
It contains he argument value for which the function, or its derivative, is being evaluated. The value @(@ n @)@ is determined by the size of the vector x .

The argument p has prototype

p == 0
In this case a numerical method is used to solve the ode and obtain an accurate approximation for @(@ y(x, 1) @)@. This numerical method has a fixed that does not depend on x .

p = 1
In this case an analytic solution for the partial derivative @(@ \partial_x y(x, 1) @)@ is returned.

The argument fp has prototype
Float>& fp
The input value of the elements of fp does not matter.

If p is zero, fp has size equal to @(@ n @)@ and contains the value of @(@ y(x, 1) @)@.

If p is one, fp has size equal to n^2 and for @(@ i = 0 , \ldots 1 @)@, @(@ j = 0 , \ldots , n-1 @)@ @[@ \D{y[i]}{x[j]} (x, 1) = fp [ i \cdot n + j ] @]@

The file ode_evaluate.cpp contains an example and test of ode_evaluate.hpp. It returns true if it succeeds and false otherwise.

Source Code
The file ode_evaluate.hpp contains the source code for this template function.
Input File: cppad/speed/ode_evaluate.hpp