\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}} }This is cppad-20221105 documentation. Here is a link to its
current documentation
.
exp_2: Second Order Forward Mode
Second Order Expansion
We define
x(t)
near
t = 0
by the second order expansion
x(t) = x^{(0)} + x^{(1)} * t + x^{(2)} * t^2 / 2
It follows that for
k = 0 , 1 , 2
,
x^{(k)} = \dpow{k}{t} x (0)
Purpose
In general, a second order forward sweep is given the
first order expansion
for all of the variables in an operation sequence,
and the second order derivatives for the independent variables.
It uses these to compute the second order derivative,
and thereby obtain the second order expansion,
for all the variables in the operation sequence.
Mathematical Form
Suppose that we use the algorithm exp_2.hpp
to compute
f(x) = 1 + x + x^2 / 2
The corresponding second derivative function is
\Dpow{2}{x} f (x) = 1
Operation Sequence
We consider the case where exp_2.hpp
is executed with
x = .5
.
The corresponding operation sequence,
zero order forward sweep values,
and first order forward sweep values
are inputs and are used by a second order forward sweep.
Index
The Index column contains the index in the operation sequence
of the corresponding atomic operation.
A Forward sweep starts with the first operation
and ends with the last.
Zero
The Zero column contains the zero order sweep results
for the corresponding variable in the operation sequence
(see zero order sweep
).
Operation
The Operation column contains the
first order sweep operation for this variable.
First
The First column contains the first order sweep results
for the corresponding variable in the operation sequence
(see first order sweep
).
Derivative
The Derivative column contains the
mathematical function corresponding to the second derivative
with respect to
t
,
at
t = 0
, for each variable in the sequence.
Second
The Second column contains the second order derivatives
for the corresponding variable in the operation sequence; i.e.,
the second order expansion for the i-th variable is given by
v_i (t) = v_i^{(0)} + v_i^{(1)} * t + v_i^{(2)} * t^2 / 2
We use
x^{(0)} = 1
, and
x^{(2)} = 0
so that second order differentiation
with respect to
t
, at
t = 0
,
is the same as the second partial differentiation
with respect to
x
at
x = x^{(0)}
.
Return Value
The second derivative of the return value for this case is
\begin{array}{rcl}
1
& = &
v_5^{(2)} =
\left[ \Dpow{2}{t} v_5 \right]_{t=0} =
\left[ \Dpow{2}{t} f( x^{(0)} + x^{(1)} * t ) \right]_{t=0}
\\
& = &
x^{(1)} * \Dpow{2}{x} f ( x^{(0)} ) * x^{(1)} =
\Dpow{2}{x} f ( x^{(0)} )
\end{array}
(We have used the fact that
x^{(1)} = 1
and
x^{(2)} = 0
.)
Which statement in the routine defined by exp_2_for2.cpp
uses
the values that are calculated by the routine
defined by exp_2_for1.cpp
?
Suppose that
x = .1
,
what are the results of a zero, first, and second order forward sweep for
the operation sequence above;
i.e., what are the corresponding values for
v_i^{(k)}
for
i = 1, \ldots , 5
and
k = 0, 1, 2
.
Create a modified version of exp_2_for2.cpp
that verifies
the derivative values from the previous exercise.
Also create and run a main program that reports the result
of calling the modified version of
exp_2_for2.cpp
.