Skip site navigation (1)Skip section navigation (2)

FreeBSD Manual Pages

  
 
  

home | help
wrkdirs::usr...::man::lmmin2(3)	 lmfit manual  wrkdirs::usr...::man::lmmin2(3)

NAME
       lmmin2 -	Levenberg-Marquardt least-squares minimization with error
       estimation

SYNOPSIS
       #include	<lmmin.h>

       void lmmin2( const int n_par, double *par, double *parerr, double
       *covar,
		   const int m_dat, const void *y, const void *data,
		   void	*evaluate(
			const double *par, const int m_dat,
			const void *data, double *fvec,	int *userbreak),
		   const lm_control_struct *control,
		   lm_status_struct *status );

       extern const lm_control_struct lm_control_double;

       extern const lm_control_struct lm_control_float;

       extern const char *lm_infmsg[];

       extern const char *lm_shortmsg[];

DESCRIPTION
       lmmin2()	determines a vector par	that minimizes the sum of squared
       elements	of fvec-y. The vector fvec is computed by a user-supplied
       function	evaluate(); the	vector y contains user-provided	values.	 On
       success,	par represents a local minimum,	not necessarily	a global one;
       it may depend on	its starting value.

       The legacy function lmmin(3) provides a simplified API without error
       estimates.

       The Levenberg-Marquardt minimization starts with	a steepest-descent
       exploration of the parameter space, and achieves	rapid convergence by
       crossing	over into the Newton-Gauss method.

       Function	arguments:

       n_par
	   Number of free variables.  Length of	parameter vector par.

       par Parameter  vector,  of  length  n_par.  On input, it	must contain a
	   reasonable guess.  On output, it contains  the  solution  found  to
	   minimize ||fvec||.

       parerr
	   Parameter  error  vector,  either  of  length  n_par,  or NULL.  On
	   output, unless it is	NULL, it contains the parameter	 uncertainties
	   for	the  unweighted	model, estimated from the diagonal elements of
	   the covariance matrix and the sum of	 squared  elements  of	fvec-y
	   divided  by	m_dat-n_par.  If your data is weighed, use square root
	   of the diagonal elements of the covariance matrix for the parameter
	   uncertainties.

       covar
	   Covariance matrix, stored as	vector of length n_par*n_par, or NULL.
	   On output, unless it	is NULL, it contains the covariance matrix.

       m_dat
	   Length of vector fvec.  Must	statisfy n_par <= m_dat.

       y   Input vector	of length m_dat.  May also be  the  null  pointer;  in
	   this	 case,	lmmin()	 minimizes  the	squared	sum of fvec instead of
	   fvec-y.

       data
	   This	pointer	is ignored by the fit algorithm, except	for  appearing
	   as an argument in all calls to the user-supplied routine evaluate.

       evaluate
	   Pointer to a	user-supplied function that computes m_dat elements of
	   vector  fvec	 for a given parameter vector par.  If evaluate	return
	   with	*userbreak set to a negative value, lmmin() will interrupt the
	   fitting and terminate.

       control
	   Parameter collection	for tuning the fit procedure.  In most	cases,
	   the	default	&lm_control_double is adequate.	 If f is only computed
	   with	single-precision accuracy, &lm_control_float should  be	 used.
	   See also below, NOTES on initializing parameter records.

	   control has the following members (for more details,	see the	source
	   file	lmstruct.h):

	   double control.ftol
	       Relative	 error	desired	 in  the  sum of squares.  Recommended
	       setting:	somewhat above machine	precision;  less  if  fvec  is
	       computed	with reduced accuracy.

	   double control.xtol
	       Relative	 error	between	 last two approximations.  Recommended
	       setting:	as ftol.

	   double control.gtol
	       A measure for degeneracy.  Recommended setting: as ftol.

	   double control.epsilon
	       Step used to calculate the Jacobian.  Recommended  setting:  as
	       ftol, but definitely less than the accuracy of fvec.

	   double control.stepbound
	       Initial	bound  to  steps  in the outer loop, generally between
	       0.01 and	100; recommended value is 100.

	   int control.patience
	       Used to set the	maximum	 number	 of  function  evaluations  to
	       patience*n_par.

	   int control.scale_diag
	       Logical	switch (0 or 1).  If 1,	then scale parameters to their
	       initial value.  This is the recommended setting.

	   FILE* control.msgfile
	       Progress	messages will be  written  to  this  file.   Typically
	       stdout  or  stderr.   The  value	 NULL  will  be	interpreted as
	       stdout.

	   int control.verbosity
	       If nonzero,  some  progress  information	 from  within  the  LM
	       algorithm is written to control.stream.

	   int control.n_maxpri
	       -1, or maximum number of	parameters to print.

	   int control.m_maxpri
	       -1, or maximum number of	residuals to print.

       status
	   A record used to return information about the minimization process:

	   double status.fnorm
	       Norm of the vector fvec;

	   int status.nfev
	       Actual number of	iterations;

	   int status.outcome
	       Status  of  minimization;  for  the corresponding text message,
	       print  lm_infmsg[status.outcome];  for  a  short	 code,	 print
	       lm_shortmsg[status.outcome].

	   int status.userbreak
	       Set  when  termination  has  been  forced  by the user-supplied
	       routine evaluate.

NOTES
   Initializing	parameter records.
       The parameter record control should always be initialized from supplied
       default records:

	   lm_control_struct control = lm_control_double; /* or	_float */

       After this, parameters may be overwritten:

	   control.patience = 500; /* allow more iterations */
	   control.verbosity = 15; /* for verbose monitoring */

       An application written this way is  guaranteed  to  work	 even  if  new
       parameters are added to lm_control_struct.

       Conversely,  addition of	parameters is not considered an	API change; it
       may happen without increment of the major version number.

EXAMPLES
   Fitting a surface
       Fit a data set y(t) by a	function f(t;p)	where t	is  a  two-dimensional
       vector:

	   #include "lmmin.h"
	   #include <stdio.h>

	   /* fit model: a plane p0 + p1*tx + p2*tz */
	   double f( double tx,	double tz, const double	*p )
	   {
	       return p[0] + p[1]*tx + p[2]*tz;
	   }

	   /* data structure to	transmit data arays and	fit model */
	   typedef struct {
	       double *tx, *tz;
	       double *y;
	       double (*f)( double tx, double tz, const	double *p );
	   } data_struct;

	   /* function evaluation, determination of residues */
	   void	evaluate_surface( const	double *par, int m_dat,
	       const void *data, double	*fvec, int *userbreak )
	   {
	       /* for readability, explicit type conversion */
	       data_struct *D;
	       D = (data_struct*)data;

	       int i;
	       for ( i = 0; i <	m_dat; i++ )
	       fvec[i] = D->y[i] - D->f( D->tx[i], D->tz[i], par );
	   }

	   int main()
	   {
	       /* parameter vector */
	       int n_par = 3; /* number	of parameters in model function	f */
	       double par[3] = { -1, 0,	1 }; /*	arbitrary starting value */
	       double parerr[3];
	       double covar[9];

	       /* data points */
	       int m_dat = 4;
	       double tx[4] = {	-1, -1,	 1,  1 };
	       double tz[4] = {	-1,  1,	-1,  1 };
	       double y[4]  = {	 0,  1,	 1,  2 };

	       data_struct data	= { tx,	tz, y, f };

	       /* auxiliary parameters */
	       lm_status_struct	status;
	       lm_control_struct control = lm_control_double;
	       control.verbosity = 3;

	       /* perform the fit */
	       printf( "Fitting:\n" );
	       lmmin2( n_par, par, parerr, covar, m_dat, (const	void*) &data,
		       evaluate_surface, &control, &status );

	       /* print	results	*/
	       printf( "\nResults:\n" );
	       printf( "status after %d	function evaluations:\n	 %s\n",
		       status.nfev, lm_infmsg[status.outcome] );

	       printf("obtained	parameters:\n");
	       int i;
	       for ( i=0; i<n_par; ++i )
	       printf("	 par[%i] = %12g	+- %12g\n", i, par[i], parerr[i]);
	       printf("obtained	norm:\n	 %12g\n", status.fnorm );

	       printf("fitting data as follows:\n");
	       double ff;
	       for ( i=0; i<m_dat; ++i ){
		   ff =	f(tx[i], tz[i],	par);
		   printf( "  t[%2d]=%12g,%12g y=%12g fit=%12g residue=%12g\n",
			   i, tx[i], tz[i], y[i], ff, y[i] - ff	);
	       }

	       return 0;
	   }

   More	examples
       For  more examples, see the homepage and	directories demo/ and test/ in
       the source distribution.

COPYING
       Copyright (C):
	  1980-1999 University of Chicago
	  2004-2018 Joachim Wuttke, Forschungszentrum Juelich GmbH

       Software: FreeBSD License

       Documentation: Creative Commons Attribution Share Alike

SEE ALSO
       lmmin(3), lmcurve(3) lmcurve2(3)

       Homepage: https://jugit.fz-juelich.de/mlz/lmfit

BUGS
       Please	send   bug   reports   and   suggestions   to	 the	author
       <j.wuttke@fz-juelich.de>.

perl v5.36.3			  2021-06-10   wrkdirs::usr...::man::lmmin2(3)

Want to link to this manual page? Use this URL:
<https://man.freebsd.org/cgi/man.cgi?query=lmmin2&sektion=3&manpath=FreeBSD+Ports+14.3.quarterly>

home | help