|
Packit |
67cb25 |
#include <stdio.h>
|
|
Packit |
67cb25 |
#include <gsl/gsl_multifit.h>
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
int
|
|
Packit |
67cb25 |
main (int argc, char **argv)
|
|
Packit |
67cb25 |
{
|
|
Packit |
67cb25 |
int i, n;
|
|
Packit |
67cb25 |
double xi, yi, ei, chisq;
|
|
Packit |
67cb25 |
gsl_matrix *X, *cov;
|
|
Packit |
67cb25 |
gsl_vector *y, *w, *c;
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
if (argc != 2)
|
|
Packit |
67cb25 |
{
|
|
Packit |
67cb25 |
fprintf (stderr,"usage: fit n < data\n");
|
|
Packit |
67cb25 |
exit (-1);
|
|
Packit |
67cb25 |
}
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
n = atoi (argv[1]);
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
X = gsl_matrix_alloc (n, 3);
|
|
Packit |
67cb25 |
y = gsl_vector_alloc (n);
|
|
Packit |
67cb25 |
w = gsl_vector_alloc (n);
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
c = gsl_vector_alloc (3);
|
|
Packit |
67cb25 |
cov = gsl_matrix_alloc (3, 3);
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
for (i = 0; i < n; i++)
|
|
Packit |
67cb25 |
{
|
|
Packit |
67cb25 |
int count = fscanf (stdin, "%lg %lg %lg",
|
|
Packit |
67cb25 |
&xi, &yi, &ei;;
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
if (count != 3)
|
|
Packit |
67cb25 |
{
|
|
Packit |
67cb25 |
fprintf (stderr, "error reading file\n");
|
|
Packit |
67cb25 |
exit (-1);
|
|
Packit |
67cb25 |
}
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
printf ("%g %g +/- %g\n", xi, yi, ei);
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
gsl_matrix_set (X, i, 0, 1.0);
|
|
Packit |
67cb25 |
gsl_matrix_set (X, i, 1, xi);
|
|
Packit |
67cb25 |
gsl_matrix_set (X, i, 2, xi*xi);
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
gsl_vector_set (y, i, yi);
|
|
Packit |
67cb25 |
gsl_vector_set (w, i, 1.0/(ei*ei));
|
|
Packit |
67cb25 |
}
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
{
|
|
Packit |
67cb25 |
gsl_multifit_linear_workspace * work
|
|
Packit |
67cb25 |
= gsl_multifit_linear_alloc (n, 3);
|
|
Packit |
67cb25 |
gsl_multifit_wlinear (X, w, y, c, cov,
|
|
Packit |
67cb25 |
&chisq, work);
|
|
Packit |
67cb25 |
gsl_multifit_linear_free (work);
|
|
Packit |
67cb25 |
}
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
#define C(i) (gsl_vector_get(c,(i)))
|
|
Packit |
67cb25 |
#define COV(i,j) (gsl_matrix_get(cov,(i),(j)))
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
{
|
|
Packit |
67cb25 |
printf ("# best fit: Y = %g + %g X + %g X^2\n",
|
|
Packit |
67cb25 |
C(0), C(1), C(2));
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
printf ("# covariance matrix:\n");
|
|
Packit |
67cb25 |
printf ("[ %+.5e, %+.5e, %+.5e \n",
|
|
Packit |
67cb25 |
COV(0,0), COV(0,1), COV(0,2));
|
|
Packit |
67cb25 |
printf (" %+.5e, %+.5e, %+.5e \n",
|
|
Packit |
67cb25 |
COV(1,0), COV(1,1), COV(1,2));
|
|
Packit |
67cb25 |
printf (" %+.5e, %+.5e, %+.5e ]\n",
|
|
Packit |
67cb25 |
COV(2,0), COV(2,1), COV(2,2));
|
|
Packit |
67cb25 |
printf ("# chisq = %g\n", chisq);
|
|
Packit |
67cb25 |
}
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
gsl_matrix_free (X);
|
|
Packit |
67cb25 |
gsl_vector_free (y);
|
|
Packit |
67cb25 |
gsl_vector_free (w);
|
|
Packit |
67cb25 |
gsl_vector_free (c);
|
|
Packit |
67cb25 |
gsl_matrix_free (cov);
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
return 0;
|
|
Packit |
67cb25 |
}
|