@cindex differentiation of functions, numeric
@cindex functions, numerical differentiation
@cindex derivatives, calculating numerically
@cindex numerical derivatives
@cindex slope, see numerical derivative

The functions described in this chapter compute numerical derivatives by
finite differencing.  An adaptive algorithm is used to find the best
choice of finite difference and to estimate the error in the derivative.
These functions are declared in the header file @file{gsl_deriv.h}.

@menu
* Numerical Differentiation functions::  
* Numerical Differentiation Examples::  
* Numerical Differentiation References::  
@end menu

@node Numerical Differentiation functions
@section Functions

@deftypefun int gsl_deriv_central (const gsl_function * @var{f}, double @var{x}, double @var{h}, double * @var{result}, double * @var{abserr})
This function computes the numerical derivative of the function @var{f}
at the point @var{x} using an adaptive central difference algorithm with
a step-size of @var{h}.   The derivative is returned in @var{result} and an
estimate of its absolute error is returned in @var{abserr}.

The initial value of @var{h} is used to estimate an optimal step-size,
based on the scaling of the truncation error and round-off error in the
derivative calculation.  The derivative is computed using a 5-point rule
for equally spaced abscissae at @math{x-h}, @math{x-h/2}, @math{x},
@math{x+h/2}, @math{x+h}, with an error estimate taken from the difference
between the 5-point rule and the corresponding 3-point rule @math{x-h},
@math{x}, @math{x+h}.  Note that the value of the function at @math{x}
does not contribute to the derivative calculation, so only 4-points are
actually used.
@end deftypefun

@deftypefun int gsl_deriv_forward (const gsl_function * @var{f}, double @var{x}, double @var{h}, double * @var{result}, double * @var{abserr})
This function computes the numerical derivative of the function @var{f}
at the point @var{x} using an adaptive forward difference algorithm with
a step-size of @var{h}. The function is evaluated only at points greater
than @var{x}, and never at @var{x} itself.  The derivative is returned in
@var{result} and an estimate of its absolute error is returned in
@var{abserr}.  This function should be used if @math{f(x)} has a
discontinuity at @var{x}, or is undefined for values less than @var{x}.

The initial value of @var{h} is used to estimate an optimal step-size,
based on the scaling of the truncation error and round-off error in the
derivative calculation.  The derivative at @math{x} is computed using an
``open'' 4-point rule for equally spaced abscissae at @math{x+h/4},
@math{x+h/2}, @math{x+3h/4}, @math{x+h}, with an error estimate taken
from the difference between the 4-point rule and the corresponding
2-point rule @math{x+h/2}, @math{x+h}. 
@end deftypefun

@deftypefun int gsl_deriv_backward (const gsl_function * @var{f}, double @var{x},  double @var{h}, double * @var{result}, double * @var{abserr})
This function computes the numerical derivative of the function @var{f}
at the point @var{x} using an adaptive backward difference algorithm
with a step-size of @var{h}. The function is evaluated only at points
less than @var{x}, and never at @var{x} itself.  The derivative is
returned in @var{result} and an estimate of its absolute error is
returned in @var{abserr}.  This function should be used if @math{f(x)}
has a discontinuity at @var{x}, or is undefined for values greater than
@var{x}.

This function is equivalent to calling @code{gsl_deriv_forward} with a
negative step-size.
@end deftypefun

@node Numerical Differentiation Examples
@section Examples

The following code estimates the derivative of the function 
@c{$f(x) = x^{3/2}$}
@math{f(x) = x^@{3/2@}} 
at @math{x=2} and at @math{x=0}.  The function @math{f(x)} is
undefined for @math{x<0} so the derivative at @math{x=0} is computed
using @code{gsl_deriv_forward}.

@example
@verbatiminclude examples/diff.c
@end example

@noindent
Here is the output of the program,

@example
$ ./a.out
@verbatiminclude examples/diff.out
@end example

@node Numerical Differentiation References
@section References and Further Reading

The algorithms used by these functions are described in the following sources:

@itemize @asis
@item
Abramowitz and Stegun, @cite{Handbook of Mathematical Functions},
Section 25.3.4, and Table 25.5 (Coefficients for Differentiation).

@item
S.D. Conte and Carl de Boor, @cite{Elementary Numerical Analysis: An
Algorithmic Approach}, McGraw-Hill, 1972.
@end itemize
