Updated exponential fitting to make it robust.
[alexxy/gromacs.git] / src / external / lmfit / lmcurve.c
1 /*
2  * Library:   lmfit (Levenberg-Marquardt least squares fitting)
3  *
4  * File:      lmcurve.c
5  *
6  * Contents:  Levenberg-Marquardt curve-fitting
7  *
8  * Copyright: Joachim Wuttke, Forschungszentrum Juelich GmbH (2004-2013)
9  *
10  * License:   see ../COPYING (FreeBSD)
11  *
12  * Homepage:  apps.jcns.fz-juelich.de/lmfit
13  */
14
15 #include "lmmin.h"
16 #include "gromacs/utility/basedefinitions.h"
17
18 typedef struct {
19     const double *t;
20     const double *y;
21     const double *dy;
22     double (*f)(double t, const double *par);
23 } lmcurve_data_struct;
24
25
26 void lmcurve_evaluate( const double *par, int m_dat, const void *data,
27                        double *fvec, gmx_unused int *info )
28 {
29     int    i;
30     double fy;
31     lmcurve_data_struct *d = (lmcurve_data_struct*) data;
32     for (i = 0; i < m_dat; i++)
33     {
34         fy      = d->f(d->t[i], par );
35         fvec[i] = (d->y[i] - fy)/d->dy[i];
36     }
37 }
38
39
40 void lmcurve( int n_par, double *par, int m_dat,
41               const double *t, const double *y, const double *dy,
42               double (*f)( double t, const double *par ),
43               const lm_control_struct *control,
44               lm_status_struct *status )
45 {
46     lmcurve_data_struct data;
47     data.t  = t;
48     data.y  = y;
49     data.dy = dy;
50     data.f  = f;
51
52     lmmin( n_par, par, m_dat, (const void*) &data,
53            lmcurve_evaluate, control, status );
54 }