| @cindex Chebyshev series |
| @cindex fitting, using Chebyshev polynomials |
| @cindex interpolation, using Chebyshev polynomials |
| |
| This chapter describes routines for computing Chebyshev approximations |
| to univariate functions. A Chebyshev approximation is a truncation of |
| the series @math{f(x) = \sum c_n T_n(x)}, where the Chebyshev |
| polynomials @math{T_n(x) = \cos(n \arccos x)} provide an orthogonal |
| basis of polynomials on the interval @math{[-1,1]} with the weight |
| function @c{$1 / \sqrt{1-x^2}$} |
| @math{1 / \sqrt@{1-x^2@}}. The first few Chebyshev polynomials are, |
| @math{T_0(x) = 1}, @math{T_1(x) = x}, @math{T_2(x) = 2 x^2 - 1}. |
| For further information see Abramowitz & Stegun, Chapter 22. |
| |
| The functions described in this chapter are declared in the header file |
| @file{gsl_chebyshev.h}. |
| |
| @menu |
| * Chebyshev Definitions:: |
| * Creation and Calculation of Chebyshev Series:: |
| * Chebyshev Series Evaluation:: |
| * Derivatives and Integrals:: |
| * Chebyshev Approximation examples:: |
| * Chebyshev Approximation References and Further Reading:: |
| @end menu |
| |
| @node Chebyshev Definitions |
| @section Definitions |
| |
| A Chebyshev series is stored using the following structure, |
| |
| @example |
| typedef struct |
| @{ |
| double * c; /* coefficients c[0] .. c[order] */ |
| int order; /* order of expansion */ |
| double a; /* lower interval point */ |
| double b; /* upper interval point */ |
| ... |
| @} gsl_cheb_series |
| @end example |
| |
| @noindent |
| The approximation is made over the range @math{[a,b]} using |
| @var{order}+1 terms, including the coefficient @math{c[0]}. The series |
| is computed using the following convention, |
| @tex |
| \beforedisplay |
| $$ |
| f(x) = {c_0 \over 2} + \sum_{n=1} c_n T_n(x) |
| $$ |
| \afterdisplay |
| @end tex |
| @ifinfo |
| |
| @example |
| f(x) = (c_0 / 2) + \sum_@{n=1@} c_n T_n(x) |
| @end example |
| |
| @end ifinfo |
| @noindent |
| which is needed when accessing the coefficients directly. |
| |
| @node Creation and Calculation of Chebyshev Series |
| @section Creation and Calculation of Chebyshev Series |
| |
| @deftypefun {gsl_cheb_series *} gsl_cheb_alloc (const size_t @var{n}) |
| This function allocates space for a Chebyshev series of order @var{n} |
| and returns a pointer to a new @code{gsl_cheb_series} struct. |
| @end deftypefun |
| |
| @deftypefun void gsl_cheb_free (gsl_cheb_series * @var{cs}) |
| This function frees a previously allocated Chebyshev series @var{cs}. |
| @end deftypefun |
| |
| @deftypefun int gsl_cheb_init (gsl_cheb_series * @var{cs}, const gsl_function * @var{f}, const double @var{a}, const double @var{b}) |
| This function computes the Chebyshev approximation @var{cs} for the |
| function @var{f} over the range @math{(a,b)} to the previously specified |
| order. The computation of the Chebyshev approximation is an |
| @math{O(n^2)} process, and requires @math{n} function evaluations. |
| @end deftypefun |
| |
| @node Chebyshev Series Evaluation |
| @section Chebyshev Series Evaluation |
| |
| @deftypefun double gsl_cheb_eval (const gsl_cheb_series * @var{cs}, double @var{x}) |
| This function evaluates the Chebyshev series @var{cs} at a given point @var{x}. |
| @end deftypefun |
| |
| @deftypefun int gsl_cheb_eval_err (const gsl_cheb_series * @var{cs}, const double @var{x}, double * @var{result}, double * @var{abserr}) |
| This function computes the Chebyshev series @var{cs} at a given point |
| @var{x}, estimating both the series @var{result} and its absolute error |
| @var{abserr}. The error estimate is made from the first neglected term |
| in the series. |
| @end deftypefun |
| |
| @deftypefun double gsl_cheb_eval_n (const gsl_cheb_series * @var{cs}, size_t @var{order}, double @var{x}) |
| This function evaluates the Chebyshev series @var{cs} at a given point |
| @var{n}, to (at most) the given order @var{order}. |
| @end deftypefun |
| |
| @deftypefun int gsl_cheb_eval_n_err (const gsl_cheb_series * @var{cs}, const size_t @var{order}, const double @var{x}, double * @var{result}, double * @var{abserr}) |
| This function evaluates a Chebyshev series @var{cs} at a given point |
| @var{x}, estimating both the series @var{result} and its absolute error |
| @var{abserr}, to (at most) the given order @var{order}. The error |
| estimate is made from the first neglected term in the series. |
| @end deftypefun |
| |
| @comment @deftypefun double gsl_cheb_eval_mode (const gsl_cheb_series * @var{cs}, double @var{x}, gsl_mode_t @var{mode}) |
| @comment @end deftypefun |
| |
| @comment @deftypefun int gsl_cheb_eval_mode_err (const gsl_cheb_series * @var{cs}, const double @var{x}, gsl_mode_t @var{mode}, double * @var{result}, double * @var{abserr}) |
| @comment Evaluate a Chebyshev series at a given point, using the default |
| @comment order for double precision mode(s) and the single precision |
| @comment order for other modes. |
| @comment @end deftypefun |
| |
| |
| @node Derivatives and Integrals |
| @section Derivatives and Integrals |
| |
| The following functions allow a Chebyshev series to be differentiated or |
| integrated, producing a new Chebyshev series. Note that the error |
| estimate produced by evaluating the derivative series will be |
| underestimated due to the contribution of higher order terms being |
| neglected. |
| |
| @deftypefun int gsl_cheb_calc_deriv (gsl_cheb_series * @var{deriv}, const gsl_cheb_series * @var{cs}) |
| This function computes the derivative of the series @var{cs}, storing |
| the derivative coefficients in the previously allocated @var{deriv}. |
| The two series @var{cs} and @var{deriv} must have been allocated with |
| the same order. |
| @end deftypefun |
| |
| @deftypefun int gsl_cheb_calc_integ (gsl_cheb_series * @var{integ}, const gsl_cheb_series * @var{cs}) |
| This function computes the integral of the series @var{cs}, storing the |
| integral coefficients in the previously allocated @var{integ}. The two |
| series @var{cs} and @var{integ} must have been allocated with the same |
| order. The lower limit of the integration is taken to be the left hand |
| end of the range @var{a}. |
| @end deftypefun |
| |
| @node Chebyshev Approximation examples |
| @section Examples |
| |
| The following example program computes Chebyshev approximations to a |
| step function. This is an extremely difficult approximation to make, |
| due to the discontinuity, and was chosen as an example where |
| approximation error is visible. For smooth functions the Chebyshev |
| approximation converges extremely rapidly and errors would not be |
| visible. |
| |
| @example |
| @verbatiminclude examples/cheb.c |
| @end example |
| |
| @noindent |
| The output from the program gives the original function, 10-th order |
| approximation and 40-th order approximation, all sampled at intervals of |
| 0.001 in @math{x}. |
| |
| @iftex |
| @sp 1 |
| @center @image{cheb,3.4in} |
| @end iftex |
| |
| @node Chebyshev Approximation References and Further Reading |
| @section References and Further Reading |
| |
| The following paper describes the use of Chebyshev series, |
| |
| @itemize @asis |
| @item |
| R. Broucke, ``Ten Subroutines for the Manipulation of Chebyshev Series |
| [C1] (Algorithm 446)''. @cite{Communications of the ACM} 16(4), 254--256 |
| (1973) |
| @end itemize |