25 #define SQR(a) ((sqrarg=(a)) == 0.0 ? 0.0 : sqrarg*sqrarg)
36 static double gammln(
double xx) {
37 double x, y, tmp, ser;
38 static double cof[6] = {76.18009172947146, -86.50532032941677,
39 24.01409824083091, -1.231739572450155,
40 0.1208650973866179e-2, -0.5395239384953e-5
46 tmp -= (x + 0.5) *
log(tmp);
47 ser = 1.000000000190015;
48 for(j = 0; j <= 5; j++) ser += cof[j] / ++y;
49 return -tmp +
log(2.5066282746310005 * ser / x);
60 static void gcf(
double *gammcf,
double a,
double x,
double *gln) {
62 double an, b,
c, d, del, h;
69 for(i = 1; i <=
ITMAX; i++) {
79 if(
fabs(del - 1.0) <
EPS)
break;
87 *gammcf =
exp(-x + a *
log(x) - (*gln)) * h;
94 static void gser(
double *gamser,
double a,
double x,
double *gln) {
111 for(n = 1; n <=
ITMAX; n++) {
116 *gamser = sum *
exp(-x + a *
log(x) - (*gln));
136 static double gammq(
double a,
double x) {
137 double gamser = 0.0, gammcf, gln;
139 if(x < 0.0 || a <= 0.0) {
145 gser(&gamser, a, x, &gln);
148 gcf(&gammcf, a, x, &gln);
167 void linfit(
double x[],
double y[],
int ndata,
168 double sig[],
int mwt,
double *a,
double *b,
double *siga,
169 double *sigb,
double *chi2,
double *q) {
174 wt, t, sxoss, sx = 0.0, sy = 0.0, st2 = 0.0, ss, sigdat;
179 for(i = 0; i < ndata; i++) {
180 wt = 1.0 /
SQR(sig[i]);
186 for(i = 0; i < ndata; i++) {
194 for(i = 0; i < ndata; i++) {
195 t = (x[i] - sxoss) / sig[i];
197 *b += t * y[i] / sig[i];
200 for(i = 0; i < ndata; i++) {
207 *a = (sy - sx * (*b)) / ss;
208 *siga =
sqrt((1.0 + sx * sx / (ss * st2)) / ss);
209 *sigb =
sqrt(1.0 / st2);
212 for(i = 0; i < ndata; i++)
213 *chi2 +=
SQR(y[i] - (*a) - (*b) * x[i]);
215 sigdat =
sqrt((*chi2) / (ndata - 2));
219 for(i = 0; i < ndata; i++)
220 *chi2 +=
SQR((y[i] - (*a) - (*b) * x[i]) / sig[i]);
221 *q = gammq(0.5 * (ndata - 2), 0.5 * (*chi2));
231 void linfit(
double x[],
double y[],
int ndata,
232 double *a,
double *b,
double *siga,
233 double *sigb,
double *chi2) {
238 t, sxoss, sx, sy, st2, sigdat;
243 for(i = 0; i < ndata; i++) {
251 for(i = 0; i < ndata; i++) {
257 *a = (sy - sx * (*b)) / ndata;
258 *siga =
sqrt((1.0 + sx * sx / (ndata * st2)) / ndata);
259 *sigb =
sqrt(1.0 / st2);
262 for(i = 0; i < ndata; i++)
263 *chi2 +=
SQR(y[i] - (*a) - (*b) * x[i]);
265 sigdat =
sqrt((*chi2) / (ndata - 2));
void writeBetError(std::string err)
PETE_TUTree< FnFabs, typename T::PETE_Expr_t > fabs(const PETE_Expr< T > &l)
Tps< T > exp(const Tps< T > &x)
Exponential.
T::PETE_Expr_t::PETE_Return_t sum(const PETE_Expr< T > &expr)
Tps< T > log(const Tps< T > &x)
Natural logarithm.
constexpr double c
The velocity of light in m/s.
void linfit(double x[], double y[], int ndata, double sig[], int mwt, double *a, double *b, double *siga, double *sigb, double *chi2, double *q)
Tps< T > sqrt(const Tps< T > &x)
Square root.