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}} }@)@
Second Order Exponential Approximation

# include "exp_2.hpp"
y = exp_2(x)

This is a simple example algorithm that is used to demonstrate Algorithmic Differentiation (see exp_eps for a more complex example).

Mathematical Form
The exponential function can be defined by @[@ \exp (x) = 1 + x^1 / 1 ! + x^2 / 2 ! + \cdots @]@ The second order approximation for the exponential function is @[@ {\rm exp\_2} (x) = 1 + x + x^2 / 2 @]@

The include command in the syntax is relative to
where cppad-yyyymmdd is the distribution directory created during the beginning steps of the installation of CppAD.

The argument x has prototype
Type &x
(see Type below). It specifies the point at which to evaluate the approximation for the second order exponential approximation.

The result y has prototype
Type y
It is the value of the exponential function approximation defined above.

If u and v are Type objects and i is an int:
Operation Result Type Description
Type(i) Type construct object with value equal to i
Type u = v Type construct u with value equal to v
u * v Type result is value of @(@ u * v @)@
u / v Type result is value of @(@ u / v @)@
u + v Type result is value of @(@ u + v @)@

exp_2.hppexp_2: Implementation
exp_2.cppexp_2: Test
exp_2_for0exp_2: Operation Sequence and Zero Order Forward Mode
exp_2_for1exp_2: First Order Forward Mode
exp_2_rev1exp_2: First Order Reverse Mode
exp_2_for2exp_2: Second Order Forward Mode
exp_2_rev2exp_2: Second Order Reverse Mode
exp_2_cppadexp_2: CppAD Forward and Reverse Sweeps

The file exp_2.hpp contains a C++ implementation of this function.

The file exp_2.cpp contains a test of this implementation. It returns true for success and false for failure.

  1. Suppose that we make the call
         double x = .1;
         double y = exp_2(x);
    What is the value assigned to v1, v2, ... ,v5 in exp_2.hpp ?
  2. Extend the routine exp_2.hpp to a routine exp_3.hpp that computes @[@ 1 + x^2 / 2 ! + x^3 / 3 ! @]@ Do this in a way that only assigns one value to each variable (as exp_2 does).
  3. Suppose that we make the call
         double x = .5;
         double y = exp_3(x);
    using exp_3 created in the previous problem. What is the value assigned to the new variables in exp_3 (variables that are in exp_3 and not in exp_2) ?

Input File: introduction/exp_2.hpp