


\subsection{Example of using the rootfinder API}

To use the bisection method, you provide a function that computes
$f(x)$, and you provide an initial bracket $(x_L..x_R)$ in which the
root is known to lie.  An example of using the bisection method to
compute a root of the quadratic function $ax^2 + bx + c = 0$ for
$a=5$, $b=2$ and $c=-1$ (note that this function has two roots, one
$<0$ and one $>0$; the bracket $0..100$ makes the example find only
the positive root):

\input{cexcerpts/rootfinder_example}


To use the Newton/Raphson method, you provide a function that computes
$f(x)$ and its first derivative $df(x)/dx$, and you provide an initial
guess for the root $x$. An example of using the Newton/Raphson method
to compute the root of the same function above (which has a derivative
$df(x)/dx = 2ax + b$) is:

\input{cexcerpts/rootfinder_example2}

In this example, because the initial guess was negative, the other
root gets found.

Currently, just these two rootfinding algorithms are implemented.  The
bisection method does not require derivative information, and it
requires the caller to provide an interval $(x_L..x_R)$ in which the
root lies ($f(x_L)$ and $f(x_R)$ have opposite signs). Newton/Raphson
uses derivative information, and it only needs an initial guess for
$x$, not an interval. Thus there are two different \ccode{\_Create*()}
routines, \ccode{esl\_rootfinder\_CreateBracketer()} for initializing
a bisection method, and \ccode{esl\_rootfinder\_CreatePolisher()} for
initializing a Newton/Raphson method. The reason for the more general
names (\ccode{CreateBracketer()} and \ccode{CreatePolisher()} is that
I expect other rootfinding algorithms (if we ever implement any) will
group similarly: bracketing methods without derivative information,
and ``polishing'' methods that use derivative information. But this
may be misguided, and may change in the future.


