#include static float sqrarg; #define SQR(a) (sqrarg=(a),sqrarg*sqrarg) void fit(x,y,ndata,sig,mwt,a,b,siga,sigb,chi2,q) float x[],y[],sig[],*a,*b,*siga,*sigb,*chi2,*q; int ndata,mwt; { int i; float wt,t,sxoss,sx=0.0,sy=0.0,st2=0.0,ss,sigdat; float gammq(); *b=0.0; if (mwt) { ss=0.0; for (i=1;i<=ndata;i++) { wt=1.0/SQR(sig[i]); ss += wt; sx += x[i]*wt; sy += y[i]*wt; } } else { for (i=1;i<=ndata;i++) { sx += x[i]; sy += y[i]; } ss=ndata; } sxoss=sx/ss; if (mwt) { for (i=1;i<=ndata;i++) { t=(x[i]-sxoss)/sig[i]; st2 += t*t; *b += t*y[i]/sig[i]; } } else { for (i=1;i<=ndata;i++) { t=x[i]-sxoss; st2 += t*t; *b += t*y[i]; } } *b /= st2; *a=(sy-sx*(*b))/ss; *siga=sqrt((1.0+sx*sx/(ss*st2))/ss); *sigb=sqrt(1.0/st2); *chi2=0.0; if (mwt == 0) { for (i=1;i<=ndata;i++) *chi2 += SQR(y[i]-(*a)-(*b)*x[i]); *q=1.0; sigdat=sqrt((*chi2)/(ndata-2)); *siga *= sigdat; *sigb *= sigdat; } else { for (i=1;i<=ndata;i++) *chi2 += SQR((y[i]-(*a)-(*b)*x[i])/sig[i]); *q=gammq(0.5*(ndata-2),0.5*(*chi2)); } } #undef SQR