Blame doc/examples/fitting2.c

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
}