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

FreeBSD Manual Pages

  
 
  

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

NAME
       lmcurve - Levenberg-Marquardt least-squares fit of a curve (t,y)

SYNOPSIS
       #include	<lmcurve.h>

       void lmcurve( const int n_par, double *par, const int m_dat,
		     const double *t, const double *y,
		     double (*f)( const	double ti, const double	*par ),
		     const lm_control_struct *control,
		     lm_status_struct *status);

       void lmcurve_tyd(
		     const int n_par, double *par, const int m_dat,
		     const double *t, const double *y, const double *dy,
		     double (*f)( const	double ti, const double	*par ),
		     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
       lmcurve() and lmcurve_tyd() wrap	the more generic minimization function
       lmmin(),	for use	in curve fitting.

       lmcurve() determines a vector par that minimizes	the sum	of squared
       elements	of a residue vector r[i] := y[i] - f(t[i];par).	Typically,
       lmcurve() is used to approximate	a data set t,y by a parametric
       function	f(ti;par). On success, par represents a	local minimum, not
       necessarily a global one; it may	depend on its starting value.

       lmcurve_tyd() does the same for a data set t,y,dy, where	dy represents
       the standard deviation of empirical data	y. Residues are	computed as
       r[i] := (y[i] - f(t[i];par))/dy[i]. Users must ensure that all dy[i]
       are positive.

       Function	arguments:

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

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

       m_dat
	   Number of data points.  Length of vectors t and y.	Must  statisfy
	   n_par <= m_dat.

       t   Array  of  length  m_dat.  Contains the abcissae (time, or "x") for
	   which function f will be evaluated.

       y   Array of length m_dat.  Contains the	ordinate values	that shall  be
	   fitted.

       dy  Only	 in  lmcurve_tyd().   Array  of	 length	 m_dat.	  Contains the
	   standard deviations of the values y.

       f   A user-supplied parametric function f(ti;par).

       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.
	   Parameters are explained in lmmin(3).

       status
	   A record used to return information about the minimization process:
	   For details,	see lmmin(3).

EXAMPLE
       Fit a data set y(x) by a	curve f(x;p):

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

	   /* model function: a	parabola */

	   double f( double t, const double *p )
	   {
	       return p[0] + p[1]*t + p[2]*t*t;
	   }

	   int main()
	   {
	       int n = 3; /* number of parameters in model function f */
	       double par[3] = { 100, 0, -10 };	/* really bad starting value */

	       /* data points: a slightly distorted standard parabola */
	       int m = 9;
	       int i;
	       double t[9] = { -4., -3., -2., -1.,  0.,	1.,  2.,  3.,  4. };
	       double y[9] = { 16.6, 9.9, 4.4, 1.1, 0.,	1.1, 4.2, 9.3, 16.4 };

	       lm_control_struct control = lm_control_double;
	       lm_status_struct	status;
	       control.verbosity = 7;

	       printf( "Fitting	...\n" );
	       lmcurve(	n, par,	m, t, y, f, &control, &status );

	       printf( "Results:\n" );
	       printf( "status after %d	function evaluations:\n	 %s\n",
		       status.nfev, lm_infmsg[status.outcome] );

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

	       printf("fitting data as follows:\n");
	       for ( i = 0; i <	m; ++i)
		   printf( "  t[%2d]=%4g y=%6g fit=%10g	residue=%12g\n",
			   i, t[i], y[i], f(t[i],par), y[i] - f(t[i],par) );

	       return 0;
	   }

COPYING
       Copyright (C) 2009-2015 Joachim Wuttke, Forschungszentrum Juelich GmbH

       Software: FreeBSD License

       Documentation: Creative Commons Attribution Share Alike

SEE ALSO
       lmmin(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::lmcurve(3)

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

home | help