Skip to content
/ lmfit Public

A C library for Levenberg-Marquardt minimization and least-squares fitting. From https://jugit.fz-juelich.de/mlz/lmfit/

License

Notifications You must be signed in to change notification settings

NSLS-II/lmfit

Repository files navigation

lmfit

Build Status

This is the home page of lmfit, a self-contained C library for Levenberg-Marquardt least-squares minimization and curve fitting.

Background information

History

The core algorithm of lmfit has been invented by K Levenberg (1944) and D W Marquardt (1963). The seminal FORTRAN implementation of MINPACK is due to J M Moré, B S Garbow, and K E Hillstrom (1980). An automatic translation into C was first published by S Moshier. The present library lmfit started from a similar automatic translation. With time, every single line was hand edited to convert the code into genuine, readable C. The API was modified; examples, man pages, and build scripts were added. Corrections and refinements were contributed by users (see CHANGELOG).

Mathematics

For a gentle introduction to the Levenberg-Marquardt algorithm, see e.g. K Madsen, H B Nielsen, O Tingleff (2004): Methods for non-linear least squares problems.

License

FreeBSD License.

Citation

When using lmfit as a tool in scientific work, no acknowledgement is needed: If fit results are robust, it does not matter by which software they have been obtained. If results are not robust, they should not be published anyway. In methodological publications, e g when describing software that interacts with lmfit, the preferred form of citation is:

Joachim Wuttke: lmfit – a C library for Levenberg-Marquardt least-squares minimization and curve fitting. Version […], retrieved on […] from https://jugit.fz-juelich.de/mlz/lmfit.

Contact

For bug reports or suggestions, contact the maintainer: [email protected].

Installation

From source

Get the latest source archive (tgz) from Repository > Tags.

Build&install are based on CMake. Out-of-source build is enforced. After unpacking the source, go to the source directory and do:

mkdir build
cd build
cmake ..
ctest
make
make install

RPM Binaries

Language bindings:

Usage

Manual pages:

  • lmfit(7): Summary.
  • lmmin2(3): Generic routine for minimizing whatever sum of squares.
  • lmmin(3): Simpler legacy API without error estimates.
  • lmcurve(3): Simpler interface for fitting a parametric function f(x;p) to a data set y(x).

Sample code:

FAQ

How to constrain parameters?

In many applications, it is desirable to impose constraints like p0>=0 or 10<p1<10.

In lmfit, there is no explicit for mechanism for this, and it is unlikely that I will ever add one: In my experience, it is sufficient to mimick constraints by variable transform or by adding a penalty to the sum of squares. Variable transform seems to be the better solution.

In the above examples: To enforce p0'>0, use e.g. p0'=exp(p0) or p0'=p0^2. To enforce -10<p1'<10, use p1'=10*tanh(p1).

How to weigh data points?

In least-squares curve fitting, data points y(x) are approximated by function values f(x;p). Sometimes, one wants to assign data points a weight w(x). One then has to minimize the sum of squares of w*(y-f).

How to implement

This can be implemented easily by copying lmcurve.h and lmcurve.c, and modifying them in obvious ways, just introducing a new parameter w.

How to choose weights

Assuming that data points y(x) follow Gaussian distributions with standard deviations dy(x), the appropriate weight is w(x) = 1 / dy(x).

How to deal with Poisson-distributed data

Least-squares fitting is not justified for Poisson-distributed data -- except if the data are large enough (say, on average y of the order of 10 or larger) so that the Poisson distribution is reasonably well approximated by a Gaussian with standard deviation dy=sqrt(y). When experimental data have on average too low values y per channel, they should be binned into fewer channels with better statistics before any least-squares fitting.

About

A C library for Levenberg-Marquardt minimization and least-squares fitting. From https://jugit.fz-juelich.de/mlz/lmfit/

Resources

License

Stars

Watchers

Forks

Packages

No packages published