Files
2025-02-Numerical/lib/nr/ansi/examples/xlfit.c
2025-09-12 18:55:25 +09:00

81 lines
1.8 KiB
C

/* Driver for routine lfit */
#include <stdio.h>
#include <math.h>
#define NRANSI
#include "nr.h"
#include "nrutil.h"
#define NPT 100
#define SPREAD 0.1
#define NTERM 5
void funcs(float x,float afunc[],int ma)
{
int i;
afunc[1]=1.0;
afunc[2]=x;
for (i=3;i<=ma;i++) afunc[i]=sin(i*x);
}
int main(void)
{
long idum=(-911);
int i,j,*ia;
float chisq,*a,*x,*y,*sig,**covar;
ia=ivector(1,NTERM);
a=vector(1,NTERM);
x=vector(1,NPT);
y=vector(1,NPT);
sig=vector(1,NPT);
covar=matrix(1,NTERM,1,NTERM);
for (i=1;i<=NPT;i++) {
x[i]=0.1*i;
funcs(x[i],a,NTERM);
y[i]=0.0;
for (j=1;j<=NTERM;j++) y[i] += j*a[j];
y[i] += SPREAD*gasdev(&idum);
sig[i]=SPREAD;
}
for (i=1;i<=NTERM;i++) ia[i]=1;
lfit(x,y,sig,NPT,a,ia,NTERM,covar,&chisq,funcs);
printf("\n%11s %21s\n","parameter","uncertainty");
for (i=1;i<=NTERM;i++)
printf(" a[%1d] = %8.6f %12.6f\n",
i,a[i],sqrt(covar[i][i]));
printf("chi-squared = %12f\n",chisq);
printf("full covariance matrix\n");
for (i=1;i<=NTERM;i++) {
for (j=1;j<=NTERM;j++) printf("%12f",covar[i][j]);
printf("\n");
}
printf("\npress RETURN to continue...\n");
(void) getchar();
/* Now check results of restricting fit parameters */
for (i=2;i<=NTERM;i+=2) ia[i]=0;
lfit(x,y,sig,NPT,a,ia,NTERM,covar,&chisq,funcs);
printf("\n%11s %21s\n","parameter","uncertainty");
for (i=1;i<=NTERM;i++)
printf(" a[%1d] = %8.6f %12.6f\n",
i,a[i],sqrt(covar[i][i]));
printf("chi-squared = %12f\n",chisq);
printf("full covariance matrix\n");
for (i=1;i<=NTERM;i++) {
for (j=1;j<=NTERM;j++) printf("%12f",covar[i][j]);
printf("\n");
}
printf("\n");
free_matrix(covar,1,NTERM,1,NTERM);
free_vector(sig,1,NPT);
free_vector(y,1,NPT);
free_vector(x,1,NPT);
free_vector(a,1,NTERM);
free_ivector(ia,1,NTERM);
return 0;
}
#undef NRANSI