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}} }@)@

`# include <cppad/speed/ode_evaluate.hpp>`

`ode_evaluate(`*x*, *p*, *fp*)

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).
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

size_t *p*

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*

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

The argument

*fp*

has prototype

CppAD::vector<*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.
The file ode_evaluate.hpp contains the source code for this template function.

Input File: cppad/speed/ode_evaluate.hpp