=pod

=begin html

<link rel="stylesheet" href="podstyle.css" type="text/css" />

=end html

=head1 NAME

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


=head1 SYNOPSIS

B<#include <lmcurve.h>>

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

B<void lmcurve_tyd(
              const int> I<n_par>B<, double *>I<par>B<, const int> I<m_dat>B<,
              constS< >double *>I<t>B<, constS< >double *>I<y>B<, constS< >double *>I<dy>B<,
              double (*>I<f>B<)( const double >I<ti>B<, const double *>I<par>B< ),
              constS< >lm_control_struct *>I<control>B<,
              lm_status_struct *>I<status>B<);>

B<extern const lm_control_struct lm_control_double;>

B<extern const lm_control_struct lm_control_float;>

B<extern const char *lm_infmsg[];>

B<extern const char *lm_shortmsg[];>

=head1 DESCRIPTION

B<lmcurve()> and B<lmcurve_tyd()> wrap the more generic minimization function B<lmmin()>, for use in curve fitting.

B<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.

B<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.


Function arguments:

=over

=item I<n_par>

Number of free variables.
Length of parameter vector I<par>.

=item I<par>

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

=item I<m_dat>

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

=item I<t>

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

=item I<y>

Array of length I<m_dat>.
Contains the ordinate values that shall be fitted.

=item I<dy>

Only in B<lmcurve_tyd()>.
Array of length I<m_dat>.
Contains the standard deviations of the values I<y>.

=item I<f>

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

=item I<control>

Parameter collection for tuning the fit procedure.
In most cases, the default &I<lm_control_double> is adequate.
If I<f> is only computed with single-precision accuracy,
I<&lm_control_float> should be used.
Parameters are explained in B<lmmin(3)>.

=item I<status>

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

=back

=head1 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;
    }

=head1 COPYING

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

Software: FreeBSD License

Documentation: Creative Commons Attribution Share Alike


=head1 SEE ALSO

=begin html

<a href="http://apps.jcns.fz-juelich.de/man/lmmin.html"><b>lmmin</b>(3)</a>

=end html

=begin man

\fBlmmin\fR(3)
.PP

=end man

Homepage: http://apps.jcns.fz-juelich.de/lmfit

=head1 BUGS

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