The LMFIT function does a non-linear least squares fit to a function with an arbitrary number of parameters. LMFIT uses the Levenberg-Marquardt algorithm, which combines the steepest descent and inverse-Hessian function fitting methods. The function may be any non-linear function.
Iterations are performed until three consecutive iterations fail to change the chi-square value by more than the specified tolerance amount, or until a maximum number of iterations have been performed. The LMFIT function returns a vector of values for the dependent variables, as fitted by the function fit.
The initial guess of the parameter values should be as close to the actual values as possible or the solution may not converge. Test the value of the variable specified by the CONVERGENCE keyword to determine whether the algorithm converged, failed to converge, or encountered a singular matrix.
This routine is written in the IDL language. Its source code can be found in the file lmfit.pro in the lib subdirectory of the IDL distribution. LMFIT is based on the routine mrqmin described in section 15.5 of Numerical Recipes in C: The Art of Scientific Computing (Second Edition), published by Cambridge University Press, and is used by permission.
Examples
In this example, we fit a function of the form:
f(x)=a[0] * exp(a[1]*x) + a[2] + a[3] * sin(x)
FUNCTION myfunct, X, A
bx = A[0]*EXP(A[1]*X)
RETURN,[ [bx+A[2]+A[3]*SIN(X)], [EXP(A[1]*X)], [bx*X], $
[1.0] ,[SIN(X)] ]
END
PRO lmfit_example
X = FINDGEN(40)/20.0
Y = 8.8 * EXP(-9.9 * X) + 11.11 + 4.9 * SIN(X)
measure_errors = 0.05 * Y
A = [10.0, -1, 2.0, 4.0]
fita = [1,1,1,1]
PLOTERR, X, Y, measure_errors
coefs = LMFIT(X, Y, A, MEASURE_ERRORS=measure_errors, /DOUBLE, $
FITA = fita, FUNCTION_NAME = 'myfunct')
OPLOT, X, coefs
END
lmfit_example
END
Syntax
Result = LMFIT( X, Y, A [, ALPHA=variable] [, CHISQ=variable] [, CONVERGENCE=variable] [, COVAR=variable] [, /DOUBLE] [, FITA=vector] [, FUNCTION_NAME=string] [, ITER=variable] [, ITMAX=value] [, ITMIN=value] [, MEASURE_ERRORS=vector] [, SIGMA=variable] [, TOL=value] )
Return Value
Returns a vector of values for the dependent variable, resulting from the function fit.
Arguments
X
An n-element vector containing the independent variable values. X may be of type integer, floating point, or double-precision floating-point.
Y
A row vector containing the dependent variables.
A
A vector that contains the initial estimate for each coefficient. Upon return, A will contain the final estimates for the coefficients.
Keywords
ALPHA
Set this keyword equal to a named variable that will contain the value of the curvature matrix.
CHISQ
Set this keyword equal to a named variable that will contain the value of the unreduced chi‑square goodness‑of‑fit statistic.
CONVERGENCE
Set this keyword equal to a named variable that will indicate whether the LMFIT algorithm converged. The possible returned values are:
- 1 = the algorithm converged.
- 0 = the algorithm did not converge.
- -1 = the algorithm encountered a singular matrix and did not converge.
Tip: If LMFIT fails to converge, try setting the DOUBLE keyword.
COVAR
Set this keyword equal to a named variable that will contain the value of the covariance matrix.
Note: The COVAR matrix depends only upon the independent variable X and (optionally) the MEASURE_ERRORS. The values do not depend upon Y. See section 15.4 of Numerical Recipes in C (Second Edition) for details.
DOUBLE
Set this keyword to force the computations to be performed in double precision.
FITA
Set this keyword equal to a vector, with as many elements as A, which contains a zero for each fixed parameter, and a non-zero value for elements of A to fit. If FITA is not specified, all parameters are taken to be non-fixed.
FUNCTION_NAME
Use this keyword to specify the name of the function to fit. If this keyword is omitted, LMFIT assumes that the IDL routine LMFUNCT is to be used. If LMFUNCT is not already compiled, IDL compiles the function from the file lmfunct.pro, located in the lib subdirectory of the IDL distribution. LMFUNCT is designed to fit a quadratic equation.
The function to be fit must be written as an IDL function and compiled prior to calling LMFIT. The function must accept a vector X (the independent variables) and a vector A containing the fitted function’s parameter values. It must return an N_ELEMENTS(A)+1-element vector in which the first (zeroth) element is the evaluated function value and the remaining elements are the partial derivatives with respect to each parameter in A.
Note: The returned value must be of the same data type as the input X value.
ITER
Set this keyword equal to a named variable that will contain the actual number of iterations which were performed
ITMAX
Set this keyword equal to the maximum number of iterations. The default is 50.
ITMIN
Set this keyword equal to the minimum number of iterations. The default is 5.
MEASURE_ERRORS
Set this keyword to a vector containing standard measurement errors for each point Y[i]. This vector must be the same length as X and Y.
Note: For Gaussian errors (e.g., instrumental uncertainties), MEASURE_ERRORS should be set to the standard deviations of each point in Y. For Poisson or statistical weighting, MEASURE_ERRORS should be set to SQRT(ABS(Y)).
SIGMA
Set this keyword to a named variable that will contain the 1-sigma uncertainty estimates for the returned parameters
Note: If MEASURE_ERRORS is omitted, then you are assuming that your user-supplied model (or the default quadratic) is the correct model for your data, and therefore, no independent goodness-of-fit test is possible. In this case, the values returned in SIGMA are multiplied by SQRT(CHISQ/(N–M)), where N is the number of points in X, and M is the number of coefficients. See section 15.2 of Numerical Recipes in C (Second Edition) for details.
TOL
Set this keyword to the convergence tolerance. The routine returns when the relative decrease in chi-squared is less than TOL in an iteration. The default is 1.0 x 10-6 for single-precision, and 1.0 x 10-12 for double-precision.
Version History
5.0 |
Introduced |
Pre 6.1 |
Deprecated WEIGHTS keyword
|
See Also
CURVEFIT, GAUSSFIT, LINFIT, POLY_FIT, REGRESS, SFIT, SVDFIT