summaryrefslogtreecommitdiff
path: root/src/lmfit/lm_eval.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lmfit/lm_eval.c')
-rw-r--r--src/lmfit/lm_eval.c81
1 files changed, 81 insertions, 0 deletions
diff --git a/src/lmfit/lm_eval.c b/src/lmfit/lm_eval.c
new file mode 100644
index 0000000..7a1b971
--- /dev/null
+++ b/src/lmfit/lm_eval.c
@@ -0,0 +1,81 @@
+#include "lmmin.h"
+#include "lm_eval.h"
+#include <stdio.h>
+
+/*
+ * This file contains default implementation of the evaluate and printout
+ * routines. In most cases, customization of lmfit can be done by modifying
+ * these two routines. Either modify them here, or copy and rename them.
+ */
+
+void lm_evaluate_default( double* par, int m_dat, double* fvec,
+ void *data, int *info )
+/*
+ * par is an input array. At the end of the minimization, it contains
+ * the approximate solution vector.
+ *
+ * m_dat is a positive integer input variable set to the number
+ * of functions.
+ *
+ * fvec is an output array of length m_dat which contains the function
+ * values the square sum of which ought to be minimized.
+ *
+ * data is a read-only pointer to lm_data_type, as specified by lmuse.h.
+ *
+ * info is an integer output variable. If set to a negative value, the
+ * minimization procedure will stop.
+ */
+{
+ int i;
+ lm_data_type *mydata;
+ mydata = (lm_data_type*)data;
+
+ for (i=0; i<m_dat; i++)
+ fvec[i] = mydata->user_y[i]
+ - mydata->user_func( mydata->user_t[i], par);
+
+ *info = *info; /* to prevent a 'unused variable' warning */
+ /* if <parameters drifted away> { *info = -1; } */
+}
+
+void lm_print_default( int n_par, double* par, int m_dat, double* fvec,
+ void *data, int iflag, int iter, int nfev )
+/*
+ * data : for soft control of printout behaviour, add control
+ * variables to the data struct
+ * iflag : 0 (init) 1 (outer loop) 2(inner loop) -1(terminated)
+ * iter : outer loop counter
+ * nfev : number of calls to *evaluate
+ */
+{
+ double f, y, t;
+ int i;
+ lm_data_type *mydata;
+ mydata = (lm_data_type*)data;
+
+ if (iflag==2) {
+ printf ("trying step in gradient direction\n");
+ } else if (iflag==1) {
+ printf ("determining gradient (iteration %d)\n", iter);
+ } else if (iflag==0) {
+ printf ("starting minimization\n");
+ } else if (iflag==-1) {
+ printf ("terminated after %d evaluations\n", nfev);
+ }
+
+ printf( " par: " );
+ for( i=0; i<n_par; ++i )
+ printf( " %12g", par[i] );
+ printf ( " => norm: %12g\n", lm_enorm( m_dat, fvec ) );
+
+ if ( iflag == -1 ) {
+ printf( " fitting data as follows:\n" );
+ for( i=0; i<m_dat; ++i ) {
+ t = (mydata->user_t)[i];
+ y = (mydata->user_y)[i];
+ f = mydata->user_func( t, par );
+ printf( " t[%2d]=%12g y=%12g fit=%12g residue=%12g\n",
+ i, t, y, f, y-f );
+ }
+ }
+}