Updated exponential fitting to make it robust.
[alexxy/gromacs.git] / src / external / lmfit / lmcurve.c
index 838f884bb6cb05c0cb152bd6e02104e10ca0b47c..4057fbff83672ee16a030060bd4e38311ee9f7e8 100644 (file)
@@ -18,6 +18,7 @@
 typedef struct {
     const double *t;
     const double *y;
+    const double *dy;
     double (*f)(double t, const double *par);
 } lmcurve_data_struct;
 
@@ -25,27 +26,28 @@ typedef struct {
 void lmcurve_evaluate( const double *par, int m_dat, const void *data,
                        double *fvec, gmx_unused int *info )
 {
-    int i;
+    int    i;
+    double fy;
+    lmcurve_data_struct *d = (lmcurve_data_struct*) data;
     for (i = 0; i < m_dat; i++)
     {
-        fvec[i] =
-            ((lmcurve_data_struct*)data)->y[i] -
-            ((lmcurve_data_struct*)data)->f(
-                    ((lmcurve_data_struct*)data)->t[i], par );
+        fy      = d->f(d->t[i], par );
+        fvec[i] = (d->y[i] - fy)/d->dy[i];
     }
 }
 
 
 void lmcurve( int n_par, double *par, int m_dat,
-              const double *t, const double *y,
+              const double *t, const double *y, const double *dy,
               double (*f)( double t, const double *par ),
               const lm_control_struct *control,
               lm_status_struct *status )
 {
     lmcurve_data_struct data;
-    data.t = t;
-    data.y = y;
-    data.f = f;
+    data.t  = t;
+    data.y  = y;
+    data.dy = dy;
+    data.f  = f;
 
     lmmin( n_par, par, m_dat, (const void*) &data,
            lmcurve_evaluate, control, status );