LMDIF_(3)
π LMDIF_(3) π
okay bestie, this is the lmdif_ page from the Library Functions Manual, and it's literally the whole nonlinear-least-squares squad in one place π«Ά grab a snack, we're doing this together.
β¨ NAME β¨
lmdif_, lmdif1_ β minimize the sum of squares of m nonlinear functions
π¦ SYNOPSIS π¦
include <minpack.h>
void lmdif1_ ( void (*fcn)(int *m, int *n, double *x, double *fvec, int
*iflag),
int *m, int * n, double *x, double *fvec,
double *tol, int *info, int *iwa, double *wa, int *lwa);
void lmdif_ ( void (*fcn)(int *m, int *n, double *x, double *fvec, int
*iflag),
int *m, int *n, double *x, double *fvec,
double *ftol, double *xtol, double *gtol, int *maxfev, double *epsfcn,
double *diag, int *mode, double *factor, int *nprint, int *info, int
*nfev, double *fjac,
int *ldfjac, int *ipvt, double *qtf,
double *wa1, double *wa2, double *wa3, double *wa4 );
πΈ DESCRIPTION πΈ
ok so lmdif_'s whole thing is minimizing the sum of the squares of m nonlinear functions in n variables, by a modification of the Levenberg-Marquardt algorithm. You, the user, have to hand it a subroutine that actually computes the functions. Then the Jacobian gets calculated by a forward-difference approximation. no cap.
lmdif1_ is giving the exact same purpose, just with a simplified calling sequence β the low-effort, high-reward bestie of the two π
π Language notes π
these functions are written in FORTRAN. if you're calling from C, keep these points in mind, fr fr:
π Name mangling
with gfortran, all the function names end in an underscore.
π₯ Compile with gfortran
even if your program is 100% C code, you should link with gfortran so it'll pull in the FORTRAN libraries automatically. honestly it's easiest to just use gfortran to do all the compiling β it handles C just fine, it's giving versatile π
π«Ά Call by reference
all function parameters must be pointers. every single one. periodt.
π Column-major arrays
suppose a function returns an array with 5 rows and 3 columns in an array z, and in the call you've declared a leading dimension of 7. the FORTRAN and equivalent C references are:
z(1,1) z[0]
z(2,1) z[1]
z(5,1) z[4]
z(1,2) z[7]
z(1,3) z[14]
z(i,j) z[(i-1) + (j-1)*7]
fcn is the name of the user-supplied subroutine which calculates the functions. in FORTRAN, fcn must be declared in an external statement in the user calling program, and should be written as follows:
subroutine fcn(m,n,x,fvec,iflag)
integer m,n,iflag
double precision x(n),fvec(m)
----------
calculate the functions at x and
return this vector in fvec.
----------
return
end
in C, fcn should be written as follows:
void fcn(int *m, int *n, double *x, double *fvec, int *iflag)
{
/* calculate the functions at x and return
the values in fvec[0] through fvec[m-1] */
}
the value of iflag should not be changed by fcn unless the user wants to terminate execution of lmdif_ (or lmdif1_). in that case, set iflag to a negative integer. that's the abort button, bestie π
β Parameters for both lmdif_ and lmdif1_ β
mβ a positive integer input variable set to the number of functions.nβ a positive integer input variable set to the number of variables.nmust not exceedm. (the math said no to anything else π)xβ an array of lengthn. on input,xmust contain an initial estimate of the solution vector. on output,xcontains the final estimate of the solution vector. glow-up arc β¨fvecβ an output array of lengthmwhich contains the functions evaluated at the outputx.
π Parameters for lmdif1_ π
tolβ a nonnegative input variable. termination occurs when the algorithm estimates either that the relative error in the sum of squares is at mosttolor that the relative error betweenxand the solution is at mosttol.infoβ an integer output variable. if the user has terminated execution,infois set to the (negative) value ofiflag. see description offcn. otherwise,infois set as follows:info = 0β improper input parameters. πinfo = 1β algorithm estimates that the relative error in the sum of squares is at mosttol.info = 2β algorithm estimates that the relative error betweenxand the solution is at mosttol.info = 3β conditions forinfo = 1andinfo = 2both hold. double slay.info = 4βfvecis orthogonal to the columns of the Jacobian to machine precision.info = 5β number of calls tofcnhas reached or exceeded200*(n+1).info = 6βtolis too small. no further reduction in the sum of squares is possible.info = 7βtolis too small. no further improvement in the approximate solutionxis possible.
iwaβ an integer work array of lengthn.waβ a work array of lengthlwa.lwaβ an integer input variable not less thanm*n + 5*n + m.
π Parameters for lmdif_ π
ftolβ a nonnegative input variable. termination occurs when both the actual and predicted relative reductions in the sum of squares are at mostftol. therefore,ftolmeasures the relative error desired in the sum of squares.xtolβ a nonnegative input variable. termination occurs when the relative error between two consecutive iterates is at mostxtol. therefore,xtolmeasures the relative error desired in the approximate solution.gtolβ a nonnegative input variable. termination occurs when the cosine of the angle betweenfvecand any column of the Jacobian is at mostgtolin absolute value. therefore,gtolmeasures the orthogonality desired between the function vector and the columns of the Jacobian.maxfevβ a positive integer input variable. termination occurs when the number of calls tofcnis at leastmaxfevby the end of an iteration.epsfcnβ an input variable used in determining a suitable step length for the forward-difference approximation. this approximation assumes that the relative errors in the functions are of the order ofepsfcn. ifepsfcnis less than the machine precision, it is assumed that the relative errors in the functions are of the order of the machine precision.diagβ an array of lengthn. ifmode = 1(see below),diagis internally set. ifmode = 2,diagmust contain positive entries that serve as multiplicative scale factors for the variables.modeβ an integer input variable. ifmode = 1, the variables will be scaled internally. ifmode = 2, the scaling is specified by the inputdiag. other values ofmodeare equivalent tomode = 1.factorβ a positive input variable used in determining the initial step bound. this bound is set to the product offactorand the euclidean norm ofdiag*xif the latter is nonzero, or else tofactoritself. in most casesfactorshould lie in the interval(.1,100.).100.is a generally recommended value.nprintβ an integer input variable that enables controlled printing of iterates if it is positive. in this case,fcnis called withiflag = 0at the beginning of the first iteration and everynprintiterations thereafter and immediately prior to return, withxandfvecavailable for printing. ifnprintis not positive, no special calls offcnwithiflag = 0are made.infoβ an integer output variable. if the user has terminated execution,infois set to the (negative) value ofiflag. see description offcn. otherwise,infois set as follows:info = 0β improper input parameters. πinfo = 1β both actual and predicted relative reductions in the sum of squares are at mostftol.info = 2β relative error between two consecutive iterates is at mostxtol.info = 3β conditions forinfo = 1andinfo = 2both hold. iconic.info = 4β the cosine of the angle betweenfvecand any column of the Jacobian is at mostgtolin absolute value.info = 5β number of calls tofcnhas reached or exceededmaxfev.info = 6βftolis too small. no further reduction in the sum of squares is possible.info = 7βxtolis too small. no further improvement in the approximate solutionxis possible.info = 8βgtolis too small.fvecis orthogonal to the columns of the Jacobian to machine precision.
nfevβ an integer output variable set to the number of calls tofcn.fjacβ an outputmbynarray. the uppernbynsubmatrix offjaccontains an upper triangular matrixrwith diagonal elements of nonincreasing magnitude such that
t t t
p *(jac *jac)*p = r *r,
where p is a permutation matrix and jac is the final calculated Jacobian. column j of p is column ipvt(j) (see below) of the identity matrix. the lower trapezoidal part of fjac contains information generated during the computation of r.
ldfjacβ a positive integer input variable not less thanmwhich specifies the leading dimension of the arrayfjac.ipvtβ an integer output array of lengthn.ipvtdefines a permutation matrixpsuch thatjac*p = q*r, wherejacis the final calculated Jacobian,qis orthogonal (not stored), andris upper triangular with diagonal elements of nonincreasing magnitude. columnjofpis columnipvt(j)of the identity matrix.qtfβ an output array of lengthnwhich contains the firstnelements of the vector(q transpose)*fvec.wa1,wa2, andwa3β work arrays of lengthn.wa4β a work array of lengthm.
π§ SEE ALSO π§
lmder(3), lmder1(3), lmstr(3), lmstr1(3).
π AUTHORS π
Jorge More', Burt Garbow, and Ken Hillstrom at Argonne National Laboratory. this manual page was written by Jim Van Zandt <jrv@debian.org>, for the Debian GNU/Linux system (but may be used by others). give them their flowers π
and that's the whole page, bestie β no cap. it came from Minpack, dated March 8, 2002, and it's the LMDIF_(3) manual page in all its glory. go forth and least-squares, you absolute main character π¦π
π¦ where this page comes from
- debian bookworm: minpack-dev 19961126+dfsg1-5 Β· BSD-4-clause-modified
- debian trixie: minpack-dev 19961126+dfsg1-5+b2 Β· BSD-4-clause-modified
- ubuntu jammy: minpack-dev 19961126+dfsg1-5build1 Β· BSD-4-clause-modified
- ubuntu noble: minpack-dev 19961126+dfsg1-5build1 Β· BSD-4-clause-modified
- ubuntu resolute: minpack-dev 19961126+dfsg1-5build2 Β· BSD-4-clause-modified
- ubuntu stonking: minpack-dev 19961126+dfsg1-5build2 Β· BSD-4-clause-modified
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash on : a language model's rewrite of the original, under its terms