lines 162-318 of file: introduction/exp_2.xrst

{xrst_begin exp_2_for1}

exp_2: First Order Forward Mode
###############################

First Order Expansion
*********************
We define :math:`x(t)` near :math:`t = 0` by the first order expansion

.. math::

   x(t) = x^{(0)} + x^{(1)} * t

it follows that :math:`x^{(0)}` is the zero,
and :math:`x^{(1)}` the first,
order derivative of :math:`x(t)`
at :math:`t = 0`.

Purpose
*******
In general, a first order forward sweep is given the
:ref:`zero order derivative<exp_2_for0@Zero Order Expansion>`
for all of the variables in an operation sequence,
and the first order derivatives for the independent variables.
It uses these to compute the first order derivatives,
and thereby obtain the first order expansion,
for all the other variables in the operation sequence.

Mathematical Form
*****************
Suppose that we use the algorithm :ref:`exp_2.hpp-name` to compute

.. math::

   f(x) = 1 + x + x^2 / 2

The corresponding derivative function is

.. math::

   \partial_x f (x) =   1 + x

An algorithmic differentiation package
does not operate on the mathematical form of the function,
or its derivative,
but rather on the
:ref:`exp_2_for0@Operation Sequence`
for the for the algorithm that is used to evaluate the function.

Operation Sequence
******************
We consider the case where :ref:`exp_2.hpp-name` is executed with
:math:`x = .5`.
The corresponding operation sequence and
zero order forward mode values
(see :ref:`zero order sweep<exp_2_for0@Operation Sequence@Sweep>` )
are inputs and are used by a first 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.

Operation
=========
The Operation column contains the
mathematical function corresponding to each atomic operation in the sequence.

Zero Order
==========
The Zero Order column contains the zero order derivatives
for the corresponding variable in the operation sequence
(see :ref:`zero order sweep<exp_2_for0@Operation Sequence@Sweep>` ).

Derivative
==========
The Derivative column contains the
mathematical function corresponding to the derivative
with respect to :math:`t`,
at :math:`t = 0`, for each variable in the sequence.

First Order
===========
The First Order column contains the first order derivatives
for the corresponding variable in the operation sequence; i.e.,

.. math::

   v_j (t) = v_j^{(0)} + v_j^{(1)} t

We use :math:`x^{(1)} = 1` so that differentiation
with respect to :math:`t`,
at :math:`t = 0`, is the same as partial differentiation
with respect to :math:`x` at :math:`x = x^{(0)}`.

Sweep
=====

.. csv-table::
   :widths: auto

   **Index**,,**Operation**,,**Zero Order**,,**Derivative**,,**First Order**
   1,,:math:`v_1 = x`,,0.5,,:math:`v_1^{(1)} = x^{(1)}`,,:math:`v_1^{(1)} = 1`
   2,,:math:`v_2 = 1 + v_1`,,1.5,,:math:`v_2^{(1)} = v_1^{(1)}`,,:math:`v_2^{(1)} = 1`
   3,,:math:`v_3 = v_1 * v_1`,,0.25,,:math:`v_3^{(1)} = 2 * v_1^{(0)} * v_1^{(1)}`,,:math:`v_3^{(1)} = 1`
   4,,:math:`v_4 = v_3 / 2`,,0.125,,:math:`v_4^{(1)} = v_3^{(1)} / 2`,,:math:`v_4^{(1)} = 0.5`
   5,,:math:`v_5 = v_2 + v_4`,,1.625,,:math:`v_5^{(1)} = v_2^{(1)} + v_4^{(1)}`,,:math:`v_5^{(1)} = 1.5`

Return Value
************
The derivative of the return value for this case is

.. math::
   :nowrap:

   \begin{eqnarray}
      1.5
      & = &
      v_5^{(1)} =
      \left[ \D{v_5}{t} \right]_{t=0} =
      \left[ \D{}{t} f ( x^{(0)} + x^{(1)} t ) \right]_{t=0}
      \\
      & = &
      f^{(1)} ( x^{(0)} ) * x^{(1)} =
      f^{(1)} ( x^{(0)} )
   \end{eqnarray}

(We have used the fact that :math:`x^{(1)} = 1`.)
{xrst_toc_hidden
   introduction/exp_2_for1.cpp
}
Verification
************
The file :ref:`exp_2_for1.cpp-name` contains a routine
which verifies the values computed above.

Exercises
*********

#. Which statement in the routine defined by :ref:`exp_2_for1.cpp-name` uses
   the values that are calculated by the routine
   defined by :ref:`exp_2_for0.cpp-name` ?
#. Suppose that :math:`x = .1`,
   what are the results of a zero and first order forward sweep for
   the operation sequence above;
   i.e., what are the corresponding values for
   :math:`v_1^{(0)}, v_2^{(0)}, \cdots , v_5^{(0)}` and
   :math:`v_1^{(1)}, v_2^{(1)}, \cdots , v_5^{(1)}` ?
#. Create a modified version of :ref:`exp_2_for1.cpp-name` 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
   :ref:`exp_2_for1.cpp-name` .

{xrst_end exp_2_for1}
