\(\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}} }\)
OdeGear¶
View page sourceAn Arbitrary Order Gear Method¶
Syntax¶
include <cppad/utility/ode_gear.hpp>
OdeGear
( F , m , n , T , X , e )Purpose¶
This routine applies Gear’s Method to solve an explicit set of ordinary differential equations. We are given \(f : \B{R} \times \B{R}^n \rightarrow \B{R}^n\) be a smooth function. This routine solves the following initial value problem
for the value of \(x( t_m )\). If your set of ordinary differential equations are not stiff an explicit method may be better (perhaps Runge45 .)
Include¶
The file cppad/utility/ode_gear.hpp
is included by cppad/cppad.hpp
but it can also be included separately with out the rest of
the CppAD
routines.
Fun¶
The class Fun and the object F satisfy the prototype
Fun & F
This must support the following set of calls
Ode
( t , x , f )Ode_dep
( t , x , f_x )t¶
The argument t has prototype
const
Scalar & t
(see description of Scalar below).
x¶
The argument x has prototype
const
Vector & x
and has size n (see description of Vector below).
f¶
The argument f to F . Ode
has prototype
Vector & f
On input and output, f is a vector of size n and the input values of the elements of f do not matter. On output, f is set equal to \(f(t, x)\) (see f ( t , x ) in Purpose ).
f_x¶
The argument f_x has prototype
Vector & f_x
On input and output, f_x is a vector of size \(n * n\) and the input values of the elements of f_x do not matter. On output,
Warning¶
The arguments f , and f_x
must have a call by reference in their prototypes; i.e.,
do not forget the &
in the prototype for
f and f_x .
m¶
The argument m has prototype
size_t
m
It specifies the order (highest power of \(t\))
used to represent the function \(x(t)\) in the multi-step method.
Upon return from OdeGear
,
the i-th component of the polynomial is defined by
for \(j = 0 , \ldots , m\) (where \(0 \leq i < n\)). The value of \(m\) must be greater than or equal one.
n¶
The argument n has prototype
size_t
n
It specifies the range space dimension of the vector valued function \(x(t)\).
T¶
The argument T has prototype
const
Vector & T
and size greater than or equal to \(m+1\). For \(j = 0 , \ldots m\), \(T[j]\) is the time corresponding to time corresponding to a previous point in the multi-step method. The value \(T[m]\) is the time of the next point in the multi-step method. The array \(T\) must be monotone increasing; i.e., \(T[j] < T[j+1]\). Above and below we often use the shorthand \(t_j\) for \(T[j]\).
X¶
The argument X has the prototype
Vector & X
and size greater than or equal to \((m+1) * n\).
On input to OdeGear
,
for \(j = 0 , \ldots , m-1\), and
\(i = 0 , \ldots , n-1\)
Upon return from OdeGear
,
for \(i = 0 , \ldots , n-1\)
e¶
The vector e is an approximate error bound for the result; i.e.,
The order of this approximation is one less than the order of the solution; i.e.,
where \(h\) is the maximum of \(t_{j+1} - t_j\).
Scalar¶
The type Scalar must satisfy the conditions for a NumericType . The routine CheckNumericType will generate an error message if this is not the case. In addition, the following operations must be defined for Scalar objects a and b :
Operation |
Description |
a < b |
less than operator (returns a |
Vector¶
The type Vector must be a SimpleVector class with elements of type Scalar . The routine CheckSimpleVector will generate an error message if this is not the case.
Example¶
The file ode_gear.cpp contains an example and test a test of using this routine.
Source Code¶
The source code for this routine is in the file
cppad/ode_gear.hpp
.
Theory¶
For this discussion we use the shorthand \(x_j\) for the value \(x ( t_j ) \in \B{R}^n\) which is not to be confused with \(x_i (t) \in \B{R}\) in the notation above. The interpolating polynomial \(p(t)\) is given by
The derivative \(p^\prime (t)\) is given by
Evaluating the derivative at the point \(t_\ell\) we have
We define the vector \(\alpha \in \B{R}^{m+1}\) by
It follows that
Gear’s method determines \(x_m\) by solving the following nonlinear equation
Newton’s method for solving this equation determines iterates, which we denote by \(x_m^k\), by solving the following affine approximation of the equation above
In order to initialize Newton’s method; i.e. choose \(x_m^0\) we define the vector \(\beta \in \B{R}^{m+1}\) by
It follows that
We solve the following approximation of the equation above to determine \(x_m^0\):
Gear’s Method¶
C. W. Gear, Simultaneous Numerical Solution of Differential-Algebraic Equations , IEEE Transactions on Circuit Theory, vol. 18, no. 1, pp. 89-95, Jan. 1971.