1 /* chbevl.c
2 *
3 * Evaluate Chebyshev series
4 *
5 *
6 *
7 * SYNOPSIS:
8 *
9 * int N;
10 * double x, y, coef[N], chebevl();
11 *
12 * y = chbevl( x, coef, N );
13 *
14 *
15 *
16 * DESCRIPTION:
17 *
18 * Evaluates the series
19 *
20 * N-1
21 * - '
22 * y = > coef[i] T (x/2)
23 * - i
24 * i=0
25 *
26 * of Chebyshev polynomials Ti at argument x/2.
27 *
28 * Coefficients are stored in reverse order, i.e. the zero
29 * order term is last in the array. Note N is the number of
30 * coefficients, not the order.
31 *
32 * If coefficients are for the interval a to b, x must
33 * have been transformed to x -> 2(2x - b - a)/(b-a) before
34 * entering the routine. This maps x from (a, b) to (-1, 1),
35 * over which the Chebyshev polynomials are defined.
36 *
37 * If the coefficients are for the inverted interval, in
38 * which (a, b) is mapped to (1/b, 1/a), the transformation
39 * required is x -> 2(2ab/x - b - a)/(b-a). If b is infinity,
40 * this becomes x -> 4a/x - 1.
41 *
42 *
43 *
44 * SPEED:
45 *
46 * Taking advantage of the recurrence properties of the
47 * Chebyshev polynomials, the routine requires one more
48 * addition per loop than evaluating a nested polynomial of
49 * the same degree.
50 *
51 */
52 /* chbevl.c */
53
54 /*
55 Cephes Math Library Release 2.0: April, 1987
56 Copyright 1985, 1987 by Stephen L. Moshier
57 Direct inquiries to 30 Frost Street, Cambridge, MA 02140
58 */
59
60 #include "cephes.h"
61
chbevl(x,array,n)62 double chbevl( x, array, n )
63 double x;
64 void *array;
65 int n;
66 {
67 double b0, b1, b2, *p;
68 int i;
69
70 p = (double *) array;
71 b0 = *p++;
72 b1 = 0.0;
73 i = n - 1;
74
75 do
76 {
77 b2 = b1;
78 b1 = b0;
79 b0 = x * b1 - b2 + *p++;
80 }
81 while( --i );
82
83 return( 0.5*(b0-b2) );
84 }
85