Prev Next Index-> contents reference index search external Up-> CppAD Introduction exp_eps exp_eps_for2 CppAD-> Install Introduction AD ADFun preprocessor multi_thread utility ipopt_solve Example speed Appendix Introduction-> exp_2 exp_eps exp_apx.cpp exp_eps-> exp_eps.hpp exp_eps.cpp exp_eps_for0 exp_eps_for1 exp_eps_rev1 exp_eps_for2 exp_eps_rev2 exp_eps_cppad exp_eps_for2-> exp_eps_for2.cpp Headings-> Second Order Expansion Purpose Mathematical Form Operation Sequence ---..Index ---..Zero ---..Operation ---..First ---..Derivative ---..Second ---..Sweep Return Value Verification Exercises

exp_eps: Second Order Forward Mode

Second Order Expansion
We define $x(t)$ and $\varepsilon(t) ]$ near $t = 0$ by the second order expansions $$\begin{array}{rcl} x(t) & = & x^{(0)} + x^{(1)} * t + x^{(2)} * t^2 / 2 \\ \varepsilon(t) & = & \varepsilon^{(0)} + \varepsilon^{(1)} * t + \varepsilon^{(2)} * t^2 / 2 \end{array}$$ It follows that for $k = 0 , 1 , 2$, $$\begin{array}{rcl} x^{(k)} & = & \dpow{k}{t} x (0) \\ \varepsilon^{(k)} & = & \dpow{k}{t} \varepsilon (0) \end{array}$$

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_eps.hpp to compute exp_eps(x, epsilon) with x is equal to .5 and epsilon is equal to .2. For this case, the mathematical function for the operation sequence corresponding to exp_eps is $$f ( x , \varepsilon ) = 1 + x + x^2 / 2$$ The corresponding second partial derivative with respect to $x$, and the value of the derivative, are $$\Dpow{2}{x} f ( x , \varepsilon ) = 1.$$

Operation Sequence

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^{(1)} = 1$, $x^{(2)} = 0$, use $\varepsilon^{(1)} = 1$, and $\varepsilon^{(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)}$.

Sweep
 Index    Zero    Operation    First    Derivative    Second 1 0.5 $v_1^{(1)} = x^{(1)}$ 1 $v_2^{(2)} = x^{(2)}$ 0 2 0.5 $v_2^{(1)} = 1 * v_1^{(1)}$ 1 $v_2^{(2)} = 1 * v_1^{(2)}$ 0 3 0.5 $v_3^{(1)} = v_2^{(1)} / 1$ 1 $v_3^{(2)} = v_2^{(2)} / 1$ 0 4 1.5 $v_4^{(1)} = v_3^{(1)}$ 1 $v_4^{(2)} = v_3^{(2)}$ 0 5 0.25 $v_5^{(1)} = v_3^{(1)} * v_1^{(0)} + v_3^{(0)} * v_1^{(1)}$ 1 $v_5^{(2)} = v_3^{(2)} * v_1^{(0)} + 2 * v_3^{(1)} * v_1^{(1)} + v_3^{(0)} * v_1^{(2)}$ 2 6 0.125 $v_6^{(1)} = v_5^{(1)} / 2$ 0.5 $v_6^{(2)} = v_5^{(2)} / 2$ 1 7 1.625 $v_7^{(1)} = v_4^{(1)} + v_6^{(1)}$ 1.5 $v_7^{(2)} = v_4^{(2)} + v_6^{(2)}$ 1
Return Value
The second derivative of the return value for this case is $$\begin{array}{rcl} 1 & = & v_7^{(2)} = \left[ \Dpow{2}{t} v_7 \right]_{t=0} = \left[ \Dpow{2}{t} f( x^{(0)} + x^{(1)} * t , \varepsilon^{(0)} ) \right]_{t=0} \\ & = & x^{(1)} * \Dpow{2}{x} f ( x^{(0)} , \varepsilon^{(0)} ) * x^{(1)} = \Dpow{2}{x} f ( x^{(0)} , \varepsilon^{(0)} ) \end{array}$$ (We have used the fact that $x^{(1)} = 1$, $x^{(2)} = 0$, $\varepsilon^{(1)} = 1$, and $\varepsilon^{(2)} = 0$.)

Verification
The file exp_eps_for2.cpp contains a routine which verifies the values computed above. It returns true for success and false for failure.

Exercises
1. Which statement in the routine defined by exp_eps_for2.cpp uses the values that are calculated by the routine defined by exp_eps_for1.cpp ?
2. 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 , 7$ and $k = 0, 1, 2$.
3. Create a modified version of exp_eps_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_eps_for2.cpp .

Input File: introduction/exp_eps.omh