lfit.c 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. #define NRANSI
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include "nrutil.h"
  5. #define REAL float
  6. void lfit(REAL x[], REAL y[], REAL sig[], int ndat, REAL a[], int ia[],
  7. int ma, REAL **covar, REAL *chisq, void (*funcs)(REAL, REAL [], int))
  8. {
  9. void covsrt(REAL **covar, int ma, int ia[], int mfit);
  10. void gaussj(REAL **a, int n, REAL **b, int m);
  11. int i,j,k,l,m,mfit=0;
  12. REAL ym,wt,sum,sig2i,**beta,*afunc;
  13. beta=matrix(1,ma,1,1);
  14. afunc=vector(1,ma);
  15. for (j=1;j<=ma;j++)
  16. if (ia[j]) mfit++;
  17. if (mfit == 0) nrerror("lfit: no parameters to be fitted");
  18. for (j=1;j<=mfit;j++) {
  19. for (k=1;k<=mfit;k++) covar[j][k]=0.0;
  20. beta[j][1]=0.0;
  21. }
  22. for (i=1;i<=ndat;i++) {
  23. (*funcs)(x[i],afunc,ma);
  24. ym=y[i];
  25. if (mfit < ma) {
  26. for (j=1;j<=ma;j++)
  27. if (!ia[j]) ym -= a[j]*afunc[j];
  28. }
  29. sig2i=1.0/SQR(sig[i]);
  30. for (j=0,l=1;l<=ma;l++) {
  31. if (ia[l]) {
  32. wt=afunc[l]*sig2i;
  33. for (j++,k=0,m=1;m<=l;m++)
  34. if (ia[m]) covar[j][++k] += wt*afunc[m];
  35. beta[j][1] += ym*wt;
  36. }
  37. }
  38. }
  39. for (j=2;j<=mfit;j++)
  40. for (k=1;k<j;k++)
  41. covar[k][j]=covar[j][k];
  42. // printf("lfit : gaussj\n");
  43. gaussj(covar,mfit,beta,1);
  44. // printf("lfit1\n");
  45. for (j=0,l=1;l<=ma;l++)
  46. if (ia[l]) a[l]=beta[++j][1];
  47. // printf("lfit2\n");
  48. *chisq=0.0;
  49. for (i=1;i<=ndat;i++) {
  50. (*funcs)(x[i],afunc,ma);
  51. for (sum=0.0,j=1;j<=ma;j++) sum += a[j]*afunc[j];
  52. *chisq += SQR((y[i]-sum)/sig[i]);
  53. }
  54. covsrt(covar,ma,ia,mfit);
  55. free_vector(afunc,1,ma);
  56. free_matrix(beta,1,ma,1,1);
  57. }
  58. #undef NRANSI