1*5ddc57e5SXin Li=pod 2*5ddc57e5SXin Li 3*5ddc57e5SXin Li=begin html 4*5ddc57e5SXin Li 5*5ddc57e5SXin Li<link rel="stylesheet" href="podstyle.css" type="text/css" /> 6*5ddc57e5SXin Li 7*5ddc57e5SXin Li=end html 8*5ddc57e5SXin Li 9*5ddc57e5SXin Li=head1 NAME 10*5ddc57e5SXin Li 11*5ddc57e5SXin Lilmcurve - Levenberg-Marquardt least-squares fit of a curve (t,y) 12*5ddc57e5SXin Li 13*5ddc57e5SXin Li 14*5ddc57e5SXin Li=head1 SYNOPSIS 15*5ddc57e5SXin Li 16*5ddc57e5SXin LiB<#include <lmcurve.h>> 17*5ddc57e5SXin Li 18*5ddc57e5SXin LiB<void lmcurve( const int> I<n_par>B<, double *>I<par>B<, const int> I<m_dat>B<, 19*5ddc57e5SXin Li constS< >double *>I<t>B<, constS< >double *>I<y>B<, 20*5ddc57e5SXin Li double (*>I<f>B<)( const double >I<ti>B<, const double *>I<par>B< ), 21*5ddc57e5SXin Li constS< >lm_control_struct *>I<control>B<, 22*5ddc57e5SXin Li lm_status_struct *>I<status>B<);> 23*5ddc57e5SXin Li 24*5ddc57e5SXin LiB<void lmcurve_tyd( 25*5ddc57e5SXin Li const int> I<n_par>B<, double *>I<par>B<, const int> I<m_dat>B<, 26*5ddc57e5SXin Li constS< >double *>I<t>B<, constS< >double *>I<y>B<, constS< >double *>I<dy>B<, 27*5ddc57e5SXin Li double (*>I<f>B<)( const double >I<ti>B<, const double *>I<par>B< ), 28*5ddc57e5SXin Li constS< >lm_control_struct *>I<control>B<, 29*5ddc57e5SXin Li lm_status_struct *>I<status>B<);> 30*5ddc57e5SXin Li 31*5ddc57e5SXin LiB<extern const lm_control_struct lm_control_double;> 32*5ddc57e5SXin Li 33*5ddc57e5SXin LiB<extern const lm_control_struct lm_control_float;> 34*5ddc57e5SXin Li 35*5ddc57e5SXin LiB<extern const char *lm_infmsg[];> 36*5ddc57e5SXin Li 37*5ddc57e5SXin LiB<extern const char *lm_shortmsg[];> 38*5ddc57e5SXin Li 39*5ddc57e5SXin Li=head1 DESCRIPTION 40*5ddc57e5SXin Li 41*5ddc57e5SXin LiB<lmcurve()> and B<lmcurve_tyd()> wrap the more generic minimization function B<lmmin()>, for use in curve fitting. 42*5ddc57e5SXin Li 43*5ddc57e5SXin LiB<lmcurve()> determines a vector I<par> that minimizes the sum of squared elements of a residue vector I<r>[i] := I<y>[i] - I<f>(I<t>[i];I<par>). Typically, B<lmcurve()> is used to approximate a data set I<t>,I<y> by a parametric function I<f>(I<ti>;I<par>). On success, I<par> represents a local minimum, not necessarily a global one; it may depend on its starting value. 44*5ddc57e5SXin Li 45*5ddc57e5SXin LiB<lmcurve_tyd()> does the same for a data set I<t>,I<y>,I<dy>, where I<dy> represents the standard deviation of empirical data I<y>. Residues are computed as I<r>[i] := (I<y>[i] - I<f>(I<t>[i];I<par>))/I<dy>[i]. Users must ensure that all I<dy>[i] are positive. 46*5ddc57e5SXin Li 47*5ddc57e5SXin Li 48*5ddc57e5SXin LiFunction arguments: 49*5ddc57e5SXin Li 50*5ddc57e5SXin Li=over 51*5ddc57e5SXin Li 52*5ddc57e5SXin Li=item I<n_par> 53*5ddc57e5SXin Li 54*5ddc57e5SXin LiNumber of free variables. 55*5ddc57e5SXin LiLength of parameter vector I<par>. 56*5ddc57e5SXin Li 57*5ddc57e5SXin Li=item I<par> 58*5ddc57e5SXin Li 59*5ddc57e5SXin LiParameter vector. 60*5ddc57e5SXin LiOn input, it must contain a reasonable guess. 61*5ddc57e5SXin LiOn output, it contains the solution found to minimize ||I<r>||. 62*5ddc57e5SXin Li 63*5ddc57e5SXin Li=item I<m_dat> 64*5ddc57e5SXin Li 65*5ddc57e5SXin LiNumber of data points. 66*5ddc57e5SXin LiLength of vectors I<t> and I<y>. 67*5ddc57e5SXin LiMust statisfy I<n_par> <= I<m_dat>. 68*5ddc57e5SXin Li 69*5ddc57e5SXin Li=item I<t> 70*5ddc57e5SXin Li 71*5ddc57e5SXin LiArray of length I<m_dat>. 72*5ddc57e5SXin LiContains the abcissae (time, or "x") for which function I<f> will be evaluated. 73*5ddc57e5SXin Li 74*5ddc57e5SXin Li=item I<y> 75*5ddc57e5SXin Li 76*5ddc57e5SXin LiArray of length I<m_dat>. 77*5ddc57e5SXin LiContains the ordinate values that shall be fitted. 78*5ddc57e5SXin Li 79*5ddc57e5SXin Li=item I<dy> 80*5ddc57e5SXin Li 81*5ddc57e5SXin LiOnly in B<lmcurve_tyd()>. 82*5ddc57e5SXin LiArray of length I<m_dat>. 83*5ddc57e5SXin LiContains the standard deviations of the values I<y>. 84*5ddc57e5SXin Li 85*5ddc57e5SXin Li=item I<f> 86*5ddc57e5SXin Li 87*5ddc57e5SXin LiA user-supplied parametric function I<f>(ti;I<par>). 88*5ddc57e5SXin Li 89*5ddc57e5SXin Li=item I<control> 90*5ddc57e5SXin Li 91*5ddc57e5SXin LiParameter collection for tuning the fit procedure. 92*5ddc57e5SXin LiIn most cases, the default &I<lm_control_double> is adequate. 93*5ddc57e5SXin LiIf I<f> is only computed with single-precision accuracy, 94*5ddc57e5SXin LiI<&lm_control_float> should be used. 95*5ddc57e5SXin LiParameters are explained in B<lmmin(3)>. 96*5ddc57e5SXin Li 97*5ddc57e5SXin Li=item I<status> 98*5ddc57e5SXin Li 99*5ddc57e5SXin LiA record used to return information about the minimization process: 100*5ddc57e5SXin LiFor details, see B<lmmin(3)>. 101*5ddc57e5SXin Li 102*5ddc57e5SXin Li=back 103*5ddc57e5SXin Li 104*5ddc57e5SXin Li=head1 EXAMPLE 105*5ddc57e5SXin Li 106*5ddc57e5SXin LiFit a data set y(x) by a curve f(x;p): 107*5ddc57e5SXin Li 108*5ddc57e5SXin Li #include "lmcurve.h" 109*5ddc57e5SXin Li #include <stdio.h> 110*5ddc57e5SXin Li 111*5ddc57e5SXin Li /* model function: a parabola */ 112*5ddc57e5SXin Li 113*5ddc57e5SXin Li double f( double t, const double *p ) 114*5ddc57e5SXin Li { 115*5ddc57e5SXin Li return p[0] + p[1]*t + p[2]*t*t; 116*5ddc57e5SXin Li } 117*5ddc57e5SXin Li 118*5ddc57e5SXin Li int main() 119*5ddc57e5SXin Li { 120*5ddc57e5SXin Li int n = 3; /* number of parameters in model function f */ 121*5ddc57e5SXin Li double par[3] = { 100, 0, -10 }; /* really bad starting value */ 122*5ddc57e5SXin Li 123*5ddc57e5SXin Li /* data points: a slightly distorted standard parabola */ 124*5ddc57e5SXin Li int m = 9; 125*5ddc57e5SXin Li int i; 126*5ddc57e5SXin Li double t[9] = { -4., -3., -2., -1., 0., 1., 2., 3., 4. }; 127*5ddc57e5SXin Li double y[9] = { 16.6, 9.9, 4.4, 1.1, 0., 1.1, 4.2, 9.3, 16.4 }; 128*5ddc57e5SXin Li 129*5ddc57e5SXin Li lm_control_struct control = lm_control_double; 130*5ddc57e5SXin Li lm_status_struct status; 131*5ddc57e5SXin Li control.verbosity = 7; 132*5ddc57e5SXin Li 133*5ddc57e5SXin Li printf( "Fitting ...\n" ); 134*5ddc57e5SXin Li lmcurve( n, par, m, t, y, f, &control, &status ); 135*5ddc57e5SXin Li 136*5ddc57e5SXin Li printf( "Results:\n" ); 137*5ddc57e5SXin Li printf( "status after %d function evaluations:\n %s\n", 138*5ddc57e5SXin Li status.nfev, lm_infmsg[status.outcome] ); 139*5ddc57e5SXin Li 140*5ddc57e5SXin Li printf("obtained parameters:\n"); 141*5ddc57e5SXin Li for ( i = 0; i < n; ++i) 142*5ddc57e5SXin Li printf(" par[%i] = %12g\n", i, par[i]); 143*5ddc57e5SXin Li printf("obtained norm:\n %12g\n", status.fnorm ); 144*5ddc57e5SXin Li 145*5ddc57e5SXin Li printf("fitting data as follows:\n"); 146*5ddc57e5SXin Li for ( i = 0; i < m; ++i) 147*5ddc57e5SXin Li printf( " t[%2d]=%4g y=%6g fit=%10g residue=%12g\n", 148*5ddc57e5SXin Li i, t[i], y[i], f(t[i],par), y[i] - f(t[i],par) ); 149*5ddc57e5SXin Li 150*5ddc57e5SXin Li return 0; 151*5ddc57e5SXin Li } 152*5ddc57e5SXin Li 153*5ddc57e5SXin Li=head1 COPYING 154*5ddc57e5SXin Li 155*5ddc57e5SXin LiCopyright (C) 2009-2015 Joachim Wuttke, Forschungszentrum Juelich GmbH 156*5ddc57e5SXin Li 157*5ddc57e5SXin LiSoftware: FreeBSD License 158*5ddc57e5SXin Li 159*5ddc57e5SXin LiDocumentation: Creative Commons Attribution Share Alike 160*5ddc57e5SXin Li 161*5ddc57e5SXin Li 162*5ddc57e5SXin Li=head1 SEE ALSO 163*5ddc57e5SXin Li 164*5ddc57e5SXin Li=begin html 165*5ddc57e5SXin Li 166*5ddc57e5SXin Li<a href="http://apps.jcns.fz-juelich.de/man/lmmin.html"><b>lmmin</b>(3)</a> 167*5ddc57e5SXin Li 168*5ddc57e5SXin Li=end html 169*5ddc57e5SXin Li 170*5ddc57e5SXin Li=begin man 171*5ddc57e5SXin Li 172*5ddc57e5SXin Li\fBlmmin\fR(3) 173*5ddc57e5SXin Li.PP 174*5ddc57e5SXin Li 175*5ddc57e5SXin Li=end man 176*5ddc57e5SXin Li 177*5ddc57e5SXin LiHomepage: http://apps.jcns.fz-juelich.de/lmfit 178*5ddc57e5SXin Li 179*5ddc57e5SXin Li=head1 BUGS 180*5ddc57e5SXin Li 181*5ddc57e5SXin LiPlease send bug reports and suggestions to the author <[email protected]>. 182