6 #define SWAP(a,b) {float temp=(a);(a)=(b);(b)=temp;}
26 v = (
float *)malloc((
unsigned) (nh-nl+1)*
sizeof(
float));
30 nrerror(
"allocation failure in vector()");
44 v= (
int *)malloc((
unsigned) (nh-nl+1)*
sizeof(
int));
48 nrerror(
"allocation failure in ivector()");
63 m= (
float **)malloc((
unsigned) (nrh-nrl+1)*
sizeof(
float*));
65 nrerror(
"allocation failure 1 in matrix()");
70 m[i]=(
float *) malloc((
unsigned) (nch-ncl+1)*
sizeof(
float));
72 nrerror(
"allocation failure 2 in matrix()");
106 for(i=nrh;i>=nrl;i--)
107 free((
char*) (m[i]+ncl));
108 free((
char*) (m+nrl));
119 int *indxc,*indxr,*ipiv;
120 int i,icol,irow,j,k,l,ll;
121 float big,dum,pivinv;
137 if(fabs(a[j][k]) >= big)
146 nrerror(
"GAUSSJ: Singular Matrix-1");
152 SWAP(a[irow][l],a[icol][l])
154 SWAP(b[irow][l],b[icol][l])
158 if(a[icol][icol] == 0.0)
159 nrerror(
"GAUSSJ: Singular Matrix-2");
160 pivinv=1.0/a[icol][icol];
163 a[icol][l] *= pivinv;
165 b[icol][l] *= pivinv;
172 a[ll][l] -= a[icol][l]*dum;
174 b[ll][l] -= b[icol][l]*dum;
179 if(indxr[l] != indxc[l])
181 SWAP(a[k][indxr[l]],a[k][indxc[l]]);
196 int mrqmin(x,y,sig,ndata,a,ma,lista,mfit,covar,alpha,chisq,funcs,alamda)
197 float x[],y[],sig[],a[],covar[
GNPARM+1][
GNPARM+1],alpha[GNPARM+1][GNPARM+1],*chisq,*alamda;
198 int ndata,ma,lista[],mfit;
202 static float *da,*atry,**oneda,*beta,ochisq;
221 nrerror(
"Bad LISTA permutation in MRQMIN-1");
224 nrerror(
"Bad LISTA permutation in MRQMIN-2");
226 mrqcof(x,y,sig,ndata,a,ma,lista,mfit,alpha,beta,chisq,funcs);
232 covar[j][k]=alpha[j][k];
233 covar[j][j]=alpha[j][j]*(1.0+(*alamda));
236 gaussj(covar,mfit,oneda,1);
241 covsrt(covar,ma,lista,mfit);
252 atry[lista[j]] = a[lista[j]]+da[j];
253 mrqcof(x,y,sig,ndata,atry,ma,lista,mfit,covar,da,chisq,funcs);
261 alpha[j][k]=covar[j][k];
263 a[lista[j]]=atry[lista[j]];
278 int mrqcof(x,y,sig,ndata,a,ma,lista,mfit,alpha,beta,chisq,funcs)
279 float x[],y[],sig[],a[],alpha[
GNPARM+1][
GNPARM+1],beta[],*chisq;
280 int ndata,ma,lista[],mfit;
284 float ymod,wt,sig2i,
dy,*dyda;
294 for(i=1;i<=ndata;i++)
299 funcs(x[i],a,&ymod,dyda);
300 sig2i=1.0/(sig[i]*sig[i]);
304 wt=dyda[lista[j]]*sig2i;
306 alpha[j][k] += wt*dyda[lista[k]];
309 (*chisq) += dy*dy*sig2i;
313 alpha[k][j]=alpha[j][k];
338 for(j=i+1;j<=mfit;j++)
340 if(lista[j] > lista[i])
342 covar[lista[j]][lista[i]]=covar[i][j];
346 covar[lista[i]][lista[j]]=covar[i][j];
355 covar[1][j]=covar[j][j];
359 covar[lista[1]][lista[1]]=swap;
363 covar[lista[j]][lista[j]]=covar[1][j];
370 covar[i][j]=covar[j][i];
378 #ifdef USE_FIT_ROUTINE
382 #define SQR(a) (sqrarg=(a),sqrarg*sqrarg)
466 float gamser,gammcf,gln;
468 if(x < 0.0 || a <= 0.0)
469 nrerror(
"Invalid arguments in routine GAMMQ");
472 gser(&gamser,a,x,&gln);
477 gcf(&gammcf,a,x,&gln);
490 float *gamser, a, x, *gln;
499 nrerror(
"x less than 0 in routine GSER");
507 for(n=1;n<=
ITMAX;n++)
512 if(fabs(del) < fabs(sum)*
EPS)
514 *gamser=sum*exp(-x+a*log(x)-(*gln));
518 nrerror(
"a too large, ITMAX too small in routine GSER");
525 float *gammcf,a,x,*gln;
528 float gold=0.0,g,fac=1.0,b1=1.0;
529 float b0=0.0,anf,ana,an,a1,a0=1.0;
533 for(n=1;n<=
ITMAX;n++)
546 if(fabs((g-gold)/g) <
EPS)
548 *gammcf=exp(-x+a*log(x)-(*gln))*g;
554 nrerror(
"a too large, ITMAX too small in routine GCF");
568 static double cof[6]={76.18009173,-86.50532033,24.01409822,
569 -1.231739516,0.120858003e-2,-0.536382e-5};
574 tmp -= (x+0.5)*log(tmp);
582 return( -tmp+log(2.50662827465*ser) );
622 float x, *a, *y, *dyda;
624 float arg1, arg2, ex, fac;
626 arg1 = -4. * log(2.0);
627 arg2 = (x - a[2]) / a[3];
628 ex = exp(arg1 * arg2 * arg2);
629 fac = a[1] * ex * arg1 * 2.0 * arg2;
634 dyda[2] = -fac / a[3];
635 dyda[3] = -fac * arg2 / a[3];
648 float *x, *y, * sig, *a;
651 float alamda= -1.0, chisq=0.0, chisq1, g, cvtest, conv_crit=0.001,
654 int ma=3, mfit=3, converged =0, i, j=1, niter=50, lista[
GNPARM+1];
661 for(i = 1; i <=npts; ++i) {
662 fgauss(x[i], a, &g, dyda);
664 chisq = chisq + resid[i] * resid[i];
667 while((j <= niter) && (converged == 0))
679 mrqmin(x,y,sig,npts,a,ma,lista,mfit,covar,alpha, &chisq1, (
void (*)(
void))
fgauss, &alamda);
680 if((chisq1 < chisq) || (chisq1 < 0.001)) {
681 cvtest = fabs( (chisq1 - chisq) / chisq );
682 if(cvtest <= conv_crit)
691 mrqmin(x,y,sig,npts,a,ma,lista,mfit,covar,alpha, &chisq1, (
void (*)(
void))
fgauss, &alamda);
int * ivector(int nl, int nh)
int log_msg(const char *fmt,...)