MercuryDPM  0.10
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
besselFunc Namespace Reference

Namespace for evaluating the zeroth modified Bessel function of the first kind, I0(x), required in StatisticsPoint.hcc. More...

Functions

Mdouble chebyshev (Mdouble x, const Mdouble coef[], int N)
 
Mdouble I0_exp (Mdouble x)
 
Mdouble I0 (Mdouble x)
 

Detailed Description

Namespace for evaluating the zeroth modified Bessel function of the first kind, I0(x), required in StatisticsPoint.hcc.

Function Documentation

Mdouble besselFunc::chebyshev ( Mdouble  x,
const Mdouble  coef[],
int  N 
)

Definition at line 98 of file ExtendedMath.cc.

Referenced by I0_exp().

99 {
100  const Mdouble *p = coef;
101  Mdouble b0 = *p++;
102  Mdouble b1=0, b2;
103  int i = N - 1;
104 
105  assert(i>0);
106  do
107  {
108  b2 = b1;
109  b1 = b0;
110  b0 = x * b1 - b2 + *p++;
111  }
112  while( --i );
113 
114  return( 0.5*(b0-b2) );
115 }
double Mdouble
Definition: ExtendedMath.h:33
Mdouble besselFunc::I0 ( Mdouble  x)

Definition at line 197 of file ExtendedMath.cc.

References I0_exp().

Referenced by StatisticsPoint< T >::CG_function().

198 {
199  if (x< 0)
200  x = -x;
201  return exp(x) * I0_exp(x);
202 }
Mdouble I0_exp(Mdouble x)
Mdouble besselFunc::I0_exp ( Mdouble  x)

Definition at line 117 of file ExtendedMath.cc.

References A, and chebyshev().

Referenced by I0().

118 {
119  // Cooefficients for [0..8]
120  const Mdouble A[] =
121  {
122  -4.415341646479339379501E-18,
123  3.330794518822238097831E-17,
124  -2.431279846547954693591E-16,
125  1.715391285555133030611E-15,
126  -1.168533287799345168081E-14,
127  7.676185498604935616881E-14,
128  -4.856446783111929460901E-13,
129  2.955052663129639834611E-12,
130  -1.726826291441555707231E-11,
131  9.675809035373236912241E-11,
132  -5.189795601635262906661E-10,
133  2.659823724682386650351E-9,
134  -1.300025009986248042121E-8,
135  6.046995022541918949321E-8,
136  -2.670793853940611733911E-7,
137  1.117387539120103718151E-6,
138  -4.416738358458750563591E-6,
139  1.644844807072889708931E-5,
140  -5.754195010082103703981E-5,
141  1.885028850958416557291E-4,
142  -5.763755745385823658851E-4,
143  1.639475616941335798421E-3,
144  -4.324309995050575944301E-3,
145  1.054646039459499831831E-2,
146  -2.373741480589946881561E-2,
147  4.930528423967070848781E-2,
148  -9.490109704804764442101E-2,
149  1.716209015222087753491E-1,
150  -3.046826723431983986831E-1,
151  6.767952744094760849951E-1
152  };
153 
154  // Cooefficients for [8..infinity]
155  const Mdouble B[] =
156  {
157  -7.233180487874753954561E-18,
158  -4.830504485944182071261E-18,
159  4.465621420296759999011E-17,
160  3.461222867697461093101E-17,
161  -2.827623980516583484941E-16,
162  -3.425485619677219134621E-16,
163  1.772560133056526383601E-15,
164  3.811680669352622420751E-15,
165  -9.554846698828307648701E-15,
166  -4.150569347287222086631E-14,
167  1.540086217521409826911E-14,
168  3.852778382742142701141E-13,
169  7.180124451383666233671E-13,
170  -1.794178531506806117781E-12,
171  -1.321581184044771311881E-11,
172  -3.149916527963241364541E-11,
173  1.188914710784643834241E-11,
174  4.940602388224969589101E-10,
175  3.396232025708386345151E-9,
176  2.266668990498178064591E-8,
177  2.048918589469063741831E-7,
178  2.891370520834756482971E-6,
179  6.889758346916823984261E-5,
180  3.369116478255694089901E-3,
181  8.044904110141088316081E-1
182  };
183 
184 
185  if (x < 0)
186  x = -x;
187 
188  if (x <= 8.0)
189  {
190  Mdouble y = (x/2.0) - 2.0;
191  return( chebyshev( y, A, 30 ) );
192  }
193 
194  return( chebyshev( 32.0/x - 2.0, B, 25 ) / sqrt(x) );
195 }
Mdouble chebyshev(Mdouble x, const Mdouble coef[], int N)
Definition: ExtendedMath.cc:98
double Mdouble
Definition: ExtendedMath.h:33