3 #include <gsl/gsl_rng.h>
4 #include <gsl/gsl_randist.h>
5 #include <gsl/gsl_vector.h>
6 #include <gsl/gsl_blas.h>
7 #include <gsl/gsl_multifit_nlin.h>
13 void print_state (size_t iter, gsl_multifit_fdfsolver * s);
18 const gsl_multifit_fdfsolver_type *T;
19 gsl_multifit_fdfsolver *s;
21 unsigned int i, iter = 0;
25 gsl_matrix *covar = gsl_matrix_alloc (p, p);
26 double y[N], sigma[N];
27 struct data d = { n, y, sigma};
28 gsl_multifit_function_fdf f;
29 double x_init[3] = { 1.0, 0.0, 0.0 };
30 gsl_vector_view x = gsl_vector_view_array (x_init, p);
31 const gsl_rng_type * type;
36 type = gsl_rng_default;
37 r = gsl_rng_alloc (type);
46 /* This is the data to be fitted */
48 for (i = 0; i < n; i++)
51 y[i] = 1.0 + 5 * exp (-0.1 * t)
52 + gsl_ran_gaussian (r, 0.1);
54 printf ("data: %u %g %g\n", i, y[i], sigma[i]);
57 T = gsl_multifit_fdfsolver_lmsder;
58 s = gsl_multifit_fdfsolver_alloc (T, n, p);
59 gsl_multifit_fdfsolver_set (s, &f, &x.vector);
61 print_state (iter, s);
66 status = gsl_multifit_fdfsolver_iterate (s);
68 printf ("status = %s\n", gsl_strerror (status));
70 print_state (iter, s);
75 status = gsl_multifit_test_delta (s->dx, s->x,
78 while (status == GSL_CONTINUE && iter < 500);
80 gsl_multifit_covar (s->J, 0.0, covar);
82 #define FIT(i) gsl_vector_get(s->x, i)
83 #define ERR(i) sqrt(gsl_matrix_get(covar,i,i))
86 double chi = gsl_blas_dnrm2(s->f);
88 double c = GSL_MAX_DBL(1, chi / sqrt(dof));
90 printf("chisq/dof = %g\n", pow(chi, 2.0) / dof);
92 printf ("A = %.5f +/- %.5f\n", FIT(0), c*ERR(0));
93 printf ("lambda = %.5f +/- %.5f\n", FIT(1), c*ERR(1));
94 printf ("b = %.5f +/- %.5f\n", FIT(2), c*ERR(2));
97 printf ("status = %s\n", gsl_strerror (status));
99 gsl_multifit_fdfsolver_free (s);
100 gsl_matrix_free (covar);
106 print_state (size_t iter, gsl_multifit_fdfsolver * s)
108 printf ("iter: %3u x = % 15.8f % 15.8f % 15.8f "
111 gsl_vector_get (s->x, 0),
112 gsl_vector_get (s->x, 1),
113 gsl_vector_get (s->x, 2),
114 gsl_blas_dnrm2 (s->f));