20 #ifndef ROOT_Math_ChebyshevPol
21 #define ROOT_Math_ChebyshevPol
23 #include <sys/types.h>
34 template<
int N>
double T(
double x) {
35 return (2.0 * x * T<N-1>(x)) - T<N-2>(x);
38 template<>
double T<0> (double );
39 template<>
double T<1> (
double x);
40 template<>
double T<2> (
double x);
41 template<>
double T<3> (
double x);
43 template<
int N>
double Eval(
double x,
const double * c) {
44 return c[N]*T<N>(x) + Eval<N-1>(x,c);
47 template<>
double Eval<0> (double ,
const double *c);
48 template<>
double Eval<1> (
double x,
const double *c);
49 template<>
double Eval<2> (
double x,
const double *c);
50 template<>
double Eval<3> (
double x,
const double *c);
57 inline double Chebyshev0(
double ,
double c0) {
60 inline double Chebyshev1(
double x,
double c0,
double c1) {
63 inline double Chebyshev2(
double x,
double c0,
double c1,
double c2) {
64 return c0 + c1*x + c2*(2.0*x*x - 1.0);
66 inline double Chebyshev3(
double x,
double c0,
double c1,
double c2,
double c3) {
67 return c3*Chebyshev::T<3>(x) + Chebyshev2(x,c0,c1,c2);
69 inline double Chebyshev4(
double x,
double c0,
double c1,
double c2,
double c3,
double c4) {
70 return c4*Chebyshev::T<4>(x) + Chebyshev3(x,c0,c1,c2,c3);
72 inline double Chebyshev5(
double x,
double c0,
double c1,
double c2,
double c3,
double c4,
double c5) {
73 return c5*Chebyshev::T<5>(x) + Chebyshev4(x,c0,c1,c2,c3,c4);
75 inline double Chebyshev6(
double x,
double c0,
double c1,
double c2,
double c3,
double c4,
double c5,
double c6) {
76 return c6*Chebyshev::T<6>(x) + Chebyshev5(x,c0,c1,c2,c3,c4,c5);
78 inline double Chebyshev7(
double x,
double c0,
double c1,
double c2,
double c3,
double c4,
double c5,
double c6,
double c7) {
79 return c7*Chebyshev::T<7>(x) + Chebyshev6(x,c0,c1,c2,c3,c4,c5,c6);
81 inline double Chebyshev8(
double x,
double c0,
double c1,
double c2,
double c3,
double c4,
double c5,
double c6,
double c7,
double c8) {
82 return c8*Chebyshev::T<8>(x) + Chebyshev7(x,c0,c1,c2,c3,c4,c5,c6,c7);
84 inline double Chebyshev9(
double x,
double c0,
double c1,
double c2,
double c3,
double c4,
double c5,
double c6,
double c7,
double c8,
double c9) {
85 return c9*Chebyshev::T<9>(x) + Chebyshev8(x,c0,c1,c2,c3,c4,c5,c6,c7,c8);
87 inline double Chebyshev10(
double x,
double c0,
double c1,
double c2,
double c3,
double c4,
double c5,
double c6,
double c7,
double c8,
double c9,
double c10) {
88 return c10*Chebyshev::T<10>(x) + Chebyshev9(x,c0,c1,c2,c3,c4,c5,c6,c7,c8,c9);
93 inline double ChebyshevN(
unsigned int n,
double x,
const double * c) {
95 if (n == 0)
return Chebyshev0(x,c[0]);
96 if (n == 1)
return Chebyshev1(x,c[0],c[1]);
97 if (n == 2)
return Chebyshev2(x,c[0],c[1],c[2]);
98 if (n == 3)
return Chebyshev3(x,c[0],c[1],c[2],c[3]);
99 if (n == 4)
return Chebyshev4(x,c[0],c[1],c[2],c[3],c[4]);
100 if (n == 5)
return Chebyshev5(x,c[0],c[1],c[2],c[3],c[4],c[5]);
116 for (i = n; i >= 1; i--)
119 d1 = y2 * d1 - d2 + c[i];
123 return x * d1 - d2 + c[0];
131 ChebyshevPol(
unsigned int n) : fOrder(n) {}
133 double operator() (
const double *x,
const double * coeff) {
134 return ChebyshevN(fOrder, x[0], coeff);
148 #endif // ROOT_Math_Chebyshev