12 #define CONV_CRIT (0.001)
14 #define SWAP(a,b) {double temp=(a);(a)=(b);(b)=temp;}
22 printf(
"%s\n", error_text);
33 v = (
double *)malloc((
unsigned) (nh-nl+1) *
sizeof(
double));
37 nrerror(
"allocation failure in vector()");
49 v = (
int *)malloc((
unsigned) (nh-nl+1) *
sizeof(
int));
53 nrerror(
"allocation failure in ivector()");
61 int nrl, nrh, ncl, nch;
66 m = (
double **)malloc((
unsigned) (nrh-nrl+1) *
sizeof(
double*));
70 nrerror(
"allocation failure 1 in matrix()");
77 m[i] = (
double *) malloc((
unsigned) (nch-ncl+1) *
sizeof(
double));
81 nrerror(
"allocation failure 2 in matrix()");
104 free((
char *)(v+nl));
117 for(i=nrh;i>=nrl;i--)
119 free((
char *)(m[i]+ncl));
122 free((
char *)(m+nrl));
133 int *indxc, *indxr, *ipiv;
134 int i, icol, irow, j, k, l, ll;
135 double big, dum, pivinv;
158 if(fabs(a[j][k]) >= big)
168 nrerror(
"GAUSSJ: Singular Matrix-1");
180 SWAP(a[irow][l], a[icol][l])
184 SWAP(b[irow][l], b[icol][l])
191 if(a[icol][icol] == 0.0)
193 nrerror(
"GAUSSJ: Singular Matrix-2");
196 pivinv = 1.0 / a[icol][icol];
201 a[icol][l] *= pivinv;
205 b[icol][l] *= pivinv;
216 a[ll][l] -= a[icol][l] * dum;
220 b[ll][l] -= b[icol][l] * dum;
228 if(indxr[l] != indxc[l])
232 SWAP(a[k][indxr[l]], a[k][indxc[l]]);
247 int mrqmin(x,y,sig,ndata,a, ma, lista, mfit, covar, alpha, chisq, funcs, alamda)
248 double x[], y[], sig[], a[],
250 alpha[NPARM+1][NPARM+1],
252 int ndata, ma, lista[], mfit;
253 void (*funcs)(
double,
double *,
double *,
double *);
256 static double *da, *atry, **oneda, *beta, ochisq;
260 oneda =
matrix(1, mfit, 1, 1);
285 nrerror(
"Bad LISTA permutation in MRQMIN-1");
291 nrerror(
"Bad LISTA permutation in MRQMIN-2");
296 mrqcof(x, y, sig, ndata, a, ma, lista, mfit, alpha, beta, chisq, funcs);
305 covar[j][k] = alpha[j][k];
308 covar[j][j] = alpha[j][j] * (1.0 + (*alamda));
309 oneda[j][1] = beta[j];
312 gaussj(covar, mfit, oneda, 1);
321 covsrt(covar, ma, lista, mfit);
337 atry[lista[j]] = a[lista[j]] + da[j];
340 mrqcof( x, y, sig, ndata, atry, ma, lista, mfit, covar, da, chisq, funcs);
351 alpha[j][k] = covar[j][k];
355 a[lista[j]] = atry[lista[j]];
368 int mrqcof(x, y, sig, ndata, a, ma, lista, mfit, alpha, beta, chisq, funcs)
369 double x[], y[], sig[], a[],
372 int ndata, ma, lista[], mfit;
373 void (*funcs)(
double,
double *,
double *,
double *);
376 double ymod, wt, sig2i,
dy, *dyda;
394 for(i=1;i<=ndata;i++)
396 funcs(x[i], a, &ymod, dyda);
398 sig2i = 1.0 / (sig[i] * sig[i]);
403 wt=dyda[lista[j]]*sig2i;
407 alpha[j][k] += wt*dyda[lista[k]];
413 (*chisq) += dy * dy * sig2i;
420 alpha[k][j] = alpha[j][k];
433 int ma, lista[], mfit;
448 for(j=i+1;j<=mfit;j++)
450 if(lista[j] > lista[i])
452 covar[lista[j]][lista[i]] = covar[i][j];
456 covar[lista[i]][lista[j]] = covar[i][j];
465 covar[1][j] = covar[j][j];
469 covar[lista[1]][lista[1]] = swap;
473 covar[lista[j]][lista[j]] = covar[1][j];
480 covar[i][j] = covar[j][i];
491 double gamser, gammcf, gln;
493 if(x < 0.0 || a <= 0.0)
495 nrerror(
"Invalid arguments in routine GAMMQ");
502 gser(&gamser, a, x, &gln);
504 return(1.0 - gamser);
508 gcf(&gammcf, a, x, &gln);
520 double *gamser, a, x, *gln;
531 nrerror(
"x less than 0 in routine GSER");
543 for(n=1;n<=
ITMAX;n++)
549 if(fabs(del) < fabs(sum) *
EPS)
551 *gamser = sum * exp(-x + a * log(x) - (*gln));
557 nrerror(
"'a' too large, ITMAX too small in routine GSER");
566 int gcf(gammcf, a, x, gln)
567 double *gammcf, a, x, *gln;
570 double gold = 0.0, g, fac = 1.0, b1 = 1.0;
571 double b0 = 0.0, anf, ana, an, a1, a0 = 1.0;
576 for(n=1;n<=
ITMAX;n++)
580 a0 = (a1 + a0 * ana) * fac;
581 b0 = (b1 + b0 * ana) * fac;
583 a1 = x * a0 + anf * a1;
584 b1 = x * b0 + anf * b1;
591 if(fabs((g - gold) / g) <
EPS)
593 *gammcf = exp(-x + a * log(x) - (*gln)) * g;
601 nrerror(
"a too large, ITMAX too small in routine GCF");
612 static double cof[6] = {76.18009173, -86.50532033, 24.01409822,
613 -1.231739516, 0.120858003e-2, -0.536382e-5 };
618 tmp -= (x + 0.5) * log(tmp);
627 return(-tmp + log(2.50662827465 * ser));
667 double x, *a, *y, *dyda;
669 double arg1, arg2, ex, fac;
671 arg1 = -4. * log(2.0);
672 arg2 = (x - a[2]) / a[3];
673 ex = exp(arg1 * arg2 * arg2);
674 fac = a[1] * ex * arg1 * 2.0 * arg2;
679 dyda[2] = -fac / a[3];
680 dyda[3] = -fac * arg2 / a[3];
691 double *x, *y, *sig, *a;
694 double alamda= -1.0, chisq=0.0, chisq1=0.0, g, cvtest,
695 dyda[
NPARM+1], resid[32768],
698 int ma=3, mfit=3, converged =0, i, j=1, niter=50, lista[
NPARM+1], ibase;
701 double height, center, hwidth;
702 double constant = 2.35482004504;
705 bzero((
char *)&dyda[0],
sizeof(dyda));
706 bzero((
char *)&resid[0],
sizeof(resid));
707 bzero((
char *)&alpha[0],
sizeof(alpha));
708 bzero((
char *)&covar[0][0],
sizeof(covar));
709 bzero((
char *)&lista[0],
sizeof(lista));
718 fgauss(x[i], a, &g, dyda);
720 chisq = chisq + resid[i] * resid[i];
728 while((j <= niter) && (converged == 0))
732 st_report(
"(1): J = %2d: Calling mrqmin: alpha = %e, chisq1 = %e", j, alpha[j][j], chisq1);
735 mrqmin(x, y, sig, npts, a, ma, lista, mfit, covar, alpha, &chisq1,
fgauss, &alamda);
741 st_report(
"(1): COVAR[%d] = %e, %e, %e", i, covar[i][1], covar[i][2], covar[i][3]);
744 st_report(
"(1): J = %2d: Testing chisq1 < chisq: %e < %e", j, chisq1, chisq);
747 if((chisq1 < chisq) || (chisq1 <
CONV_CRIT))
749 cvtest = fabs( (chisq1 - chisq) / chisq );
760 st_report(
"Converged after %d interations", j);
778 st_report(
"(2): J = %2d: Calling mrqmin: alpha = %e, chisq1 = %e", j, alpha[j][j], chisq1);
781 mrqmin(x, y, sig, npts, a, ma, lista, mfit, covar, alpha, &chisq1,
fgauss, &alamda);
787 st_report(
"(2): COVAR[%d] = %e, %e, %e", i, covar[i][1], covar[i][2], covar[i][3]);
796 fgauss(x[j], a, &g, dyda);
810 sumsq = sqrt(chisq1 / (
double)(ibase-mfit));
816 hwidth = a[3] * constant;
818 hghterr = height * sqrt( covar[1][1] / (a[1]*a[1])) * sumsq;
819 cnterr = sqrt( covar[2][2]) * sumsq;
820 hwerr = hwidth * sqrt( covar[3][3] / (a[3]*a[3])) * sumsq;
int * ivector(int nl, int nh)