51 if (gamma_in > 1.0 + ep)
53 return ((gamma_in - 1) *
gamma(gamma_in - 1));
58 if ((gamma_in - ep < 1.0) && (gamma_in + ep > 1.0))
60 else if ((gamma_in - ep < 0.5) && (gamma_in + ep > 0.5))
63 return std::numeric_limits<Mdouble>::quiet_NaN();
74 Mdouble mainfactor = pow(x, k / 2.0 - 1) * exp(x / -2.0);
76 return mainfactor / prefactor;
90 const int num_steps_per_unit = 100;
93 long int num_steps =
static_cast<int>(num_steps_per_unit * x_max);
95 for (
int i = 0; i < num_steps; i++)
97 x = x_max / num_steps * (i + 0.5);
100 return 1.0 - sum * x_max / num_steps;
106 if (std::abs(max - min) < endCondition)
108 return 0.5 * (min + max);
110 std::cout <<
"Min=" << min <<
" Max=" << max <<
" diff=" << max - min << std::endl;
111 double resphi = 2 - 0.5 * (1 + std::sqrt(5));
113 if (max - cur > cur - min)
115 x = cur + resphi * (max - cur);
119 x = cur - resphi * (cur - min);
121 if(std::isnan(curVal))
122 curVal =
function(cur);
123 double xVal =
function(x);
126 if (max - cur > cur - min)
137 if (max - cur > cur - min)
150 return std::abs(v1 - v2) <= absError;
171 b0 = x * b1 - b2 + *p++;
175 return (0.5 * (b0 - b2));
183 -4.415341646479339379501E-18,
184 3.330794518822238097831E-17,
185 -2.431279846547954693591E-16,
186 1.715391285555133030611E-15,
187 -1.168533287799345168081E-14,
188 7.676185498604935616881E-14,
189 -4.856446783111929460901E-13,
190 2.955052663129639834611E-12,
191 -1.726826291441555707231E-11,
192 9.675809035373236912241E-11,
193 -5.189795601635262906661E-10,
194 2.659823724682386650351E-9,
195 -1.300025009986248042121E-8,
196 6.046995022541918949321E-8,
197 -2.670793853940611733911E-7,
198 1.117387539120103718151E-6,
199 -4.416738358458750563591E-6,
200 1.644844807072889708931E-5,
201 -5.754195010082103703981E-5,
202 1.885028850958416557291E-4,
203 -5.763755745385823658851E-4,
204 1.639475616941335798421E-3,
205 -4.324309995050575944301E-3,
206 1.054646039459499831831E-2,
207 -2.373741480589946881561E-2,
208 4.930528423967070848781E-2,
209 -9.490109704804764442101E-2,
210 1.716209015222087753491E-1,
211 -3.046826723431983986831E-1,
212 6.767952744094760849951E-1
218 -7.233180487874753954561E-18,
219 -4.830504485944182071261E-18,
220 4.465621420296759999011E-17,
221 3.461222867697461093101E-17,
222 -2.827623980516583484941E-16,
223 -3.425485619677219134621E-16,
224 1.772560133056526383601E-15,
225 3.811680669352622420751E-15,
226 -9.554846698828307648701E-15,
227 -4.150569347287222086631E-14,
228 1.540086217521409826911E-14,
229 3.852778382742142701141E-13,
230 7.180124451383666233671E-13,
231 -1.794178531506806117781E-12,
232 -1.321581184044771311881E-11,
233 -3.149916527963241364541E-11,
234 1.188914710784643834241E-11,
235 4.940602388224969589101E-10,
236 3.396232025708386345151E-9,
237 2.266668990498178064591E-8,
238 2.048918589469063741831E-7,
239 2.891370520834756482971E-6,
240 6.889758346916823984261E-5,
241 3.369116478255694089901E-3,
242 8.044904110141088316081E-1
254 return (
chebyshev(32.0 / x - 2.0, B, 25) / sqrt(x));
261 return exp(x) *
I0_exp(x);
Mdouble chebyshev(Mdouble x, const Mdouble coef[], int N)
Mdouble X
the vector components
Mdouble chi_squared_prob(const Mdouble x, const unsigned int k)
This is the function which actually gives the probability back using a chi squared test...
Mdouble I0_exp(Mdouble x)
bool isEqual(Mdouble v1, Mdouble v2, double absError)
Compares the difference of two Mdouble with an absolute error, useful in UnitTests.
double goldenSectionSearch(double(*function)(const double), double min, double cur, double max, double endCondition, double curVal=std::numeric_limits< Mdouble >::quiet_NaN())
This function performs a golden section search to find the location of the minimum of a function...
Mdouble gamma(Mdouble gamma_in)
This is the gamma function returns the true value for the half integer value.
Mdouble chi_squared(const Mdouble x, const unsigned int k)
This is a chi_squared function return the value x and degrees of freedom k.
Implementation of a 3D vector (by Vitaliy).