| 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 );
}
}
}