83 lines
1.6 KiB
C
83 lines
1.6 KiB
C
|
/* chbevl.c
|
|||
|
*
|
|||
|
* Evaluate Chebyshev series
|
|||
|
*
|
|||
|
*
|
|||
|
*
|
|||
|
* SYNOPSIS:
|
|||
|
*
|
|||
|
* int N;
|
|||
|
* double x, y, coef[N], chebevl();
|
|||
|
*
|
|||
|
* y = chbevl( x, coef, N );
|
|||
|
*
|
|||
|
*
|
|||
|
*
|
|||
|
* DESCRIPTION:
|
|||
|
*
|
|||
|
* Evaluates the series
|
|||
|
*
|
|||
|
* N-1
|
|||
|
* - '
|
|||
|
* y = > coef[i] T (x/2)
|
|||
|
* - i
|
|||
|
* i=0
|
|||
|
*
|
|||
|
* of Chebyshev polynomials Ti at argument x/2.
|
|||
|
*
|
|||
|
* Coefficients are stored in reverse order, i.e. the zero
|
|||
|
* order term is last in the array. Note N is the number of
|
|||
|
* coefficients, not the order.
|
|||
|
*
|
|||
|
* If coefficients are for the interval a to b, x must
|
|||
|
* have been transformed to x -> 2(2x - b - a)/(b-a) before
|
|||
|
* entering the routine. This maps x from (a, b) to (-1, 1),
|
|||
|
* over which the Chebyshev polynomials are defined.
|
|||
|
*
|
|||
|
* If the coefficients are for the inverted interval, in
|
|||
|
* which (a, b) is mapped to (1/b, 1/a), the transformation
|
|||
|
* required is x -> 2(2ab/x - b - a)/(b-a). If b is infinity,
|
|||
|
* this becomes x -> 4a/x - 1.
|
|||
|
*
|
|||
|
*
|
|||
|
*
|
|||
|
* SPEED:
|
|||
|
*
|
|||
|
* Taking advantage of the recurrence properties of the
|
|||
|
* Chebyshev polynomials, the routine requires one more
|
|||
|
* addition per loop than evaluating a nested polynomial of
|
|||
|
* the same degree.
|
|||
|
*
|
|||
|
*/
|
|||
|
/* chbevl.c */
|
|||
|
|
|||
|
/*
|
|||
|
Cephes Math Library Release 2.0: April, 1987
|
|||
|
Copyright 1985, 1987 by Stephen L. Moshier
|
|||
|
Direct inquiries to 30 Frost Street, Cambridge, MA 02140
|
|||
|
*/
|
|||
|
|
|||
|
double chbevl( x, array, n )
|
|||
|
double x;
|
|||
|
double array[];
|
|||
|
int n;
|
|||
|
{
|
|||
|
double b0, b1, b2, *p;
|
|||
|
int i;
|
|||
|
|
|||
|
p = array;
|
|||
|
b0 = *p++;
|
|||
|
b1 = 0.0;
|
|||
|
i = n - 1;
|
|||
|
|
|||
|
do
|
|||
|
{
|
|||
|
b2 = b1;
|
|||
|
b1 = b0;
|
|||
|
b0 = x * b1 - b2 + *p++;
|
|||
|
}
|
|||
|
while( --i );
|
|||
|
|
|||
|
return( 0.5*(b0-b2) );
|
|||
|
}
|