Prev Next Index-> contents reference index search external Up-> CppAD Introduction exp_eps 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 Headings-> Syntax Purpose Mathematical Function include x epsilon y Type Implementation Test Exercises

$\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}} }$
An Epsilon Accurate Exponential Approximation

Syntax
# include "exp_eps.hpp"   y = exp_eps(x, epsilon)

Purpose
This is a an example algorithm that is used to demonstrate how Algorithmic Differentiation works with loops and boolean decision variables (see exp_2 for a simpler example).

Mathematical Function
The exponential function can be defined by $$\exp (x) = 1 + x^1 / 1 ! + x^2 / 2 ! + \cdots$$ We define $k ( x, \varepsilon )$ as the smallest non-negative integer such that $\varepsilon \geq x^k / k !$; i.e., $$k( x, \varepsilon ) = \min \{ k \in {\rm Z}_+ \; | \; \varepsilon \geq x^k / k ! \}$$ The mathematical form for our approximation of the exponential function is $$\begin{array}{rcl} {\rm exp\_eps} (x , \varepsilon ) & = & \left\{ \begin{array}{ll} \frac{1}{ {\rm exp\_eps} (-x , \varepsilon ) } & {\rm if} \; x < 0 \\ 1 + x^1 / 1 ! + \cdots + x^{k( x, \varepsilon)} / k( x, \varepsilon ) ! & {\rm otherwise} \end{array} \right. \end{array}$$

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

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

epsilon
The argument epsilon has prototype       const Type &epsilon  It specifies the accuracy with which to approximate the exponential function value; i.e., it is the value of $\varepsilon$ in the exponential function approximation defined above.

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

Type
If u and v are Type objects and i is an int:
 Operation Result Type Description Type(i) Type object with value equal to i Type u = v Type construct u with value equal to v u > v bool true, if u greater than v , an false otherwise u = v Type new u (and result) is value of 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$ -u Type result is value of $- u$

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

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

Exercises
1. Using the definition of $k( x, \varepsilon )$ above, what is the value of $k(.5, 1)$, $k(.5, .1)$, and $k(.5, .01)$ ?
2. Suppose that we make the following call to exp_eps:  double x = 1.; double epsilon = .01; double y = exp_eps(x, epsilon);  What is the value assigned to k, temp, term, and sum the first time through the while loop in exp_eps.hpp ?
3. Continuing the previous exercise, what is the value assigned to k, temp, term, and sum the second time through the while loop in exp_eps.hpp ?

Input File: introduction/exp_eps.hpp