lm_eval.cpp.html | mathcode2html |
Source file: lm_eval.cpp | |
Converted: Tue Apr 17 2012 at 11:03:43 | |
This documentation file will not reflect any later changes in the source file. |
$$\phantom{******** If you see this on the webpage then the
browser could not locate *********}$$
$$\phantom{******** jsMath/easy/load.js or the variable root
is set wrong in this file *********}$$
$$\newcommand{\vector}[1]{\left[\begin{array}{c} #1 \end{array}\right]}$$
$$\newenvironment{matrix}{\left[\begin{array}{cccccccccc}} {\end{array}\right]}$$
$$\newcommand{\A}{{\cal A}}$$
$$\newcommand{\W}{{\cal W}}$$
#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 ); } } }