LMSTR_(3)
β¨ LMSTR_ β¨
okay bestie, buckle UP π today we're talking about lmstr_ and lmstr1_ β the duo that minimizes the sum of squares of m nonlinear functions, with a user-supplied Jacobian and minimal storage. yes, minimal storage. she's efficient AND iconic. π
πΈ SYNOPSIS πΈ
include <minpack.h>
void lmstr1_ ( void (*fcn) (int *m, int *n, double *x, double *fvec,
double *fjrow, int *iflag),
int *m, int * n, double *x, double *fvec, double *fjac,
int *ldfjac,
double *tol, int *info, int *iwa,
double *wa, int *kwa);
void lmstr_ ( void (*fcn)( int *m, int *n, double *x, double *fvec,
double *fjrow, int *iflag),
int *m, int *n, double *x, double *fvec, double *fjac, int
*ldfjac,
double *ftol, double *xtol, double *gtol,
int *maxfev, double *diag, int *mode, double *factor,
int *nprint, int *info, int *nfev, int *njev,
int *ipvt, double *qtf,
double *wa1, double *wa2, double *wa3, double *wa4 );
π DESCRIPTION π
ok so the whole point of lmstr_ is to minimize the sum of the squares of m nonlinear functions in n variables, using a modified Levenberg-Marquardt algorithm. and the twist? you have to hand her a function that calculates both the functions and the rows of the Jacobian. teamwork, bestie π€
lmstr1_ does the exact same thing but with a simplified calling sequence β the low-effort-entry version, we love her π«Ά
lmder(3) and lmder1(3) also do the same thing but they do not attempt to minimize storage. so if storage is your priority, stay right here. β¨
π¦ Language notes π¦
these functions are written in FORTRAN. if you're calling from C, keep these in mind, no cap:
- Name mangling. with
gfortran, all the function names end in an underscore. (hi, that's the_you see everywhere π) - Compile with gfortran. even if your program is all C code, you should link with
gfortranso it will pull in the FORTRAN libraries automatically. it's easiest just to usegfortranto do all the compiling. (it handles C just fine.) β¨ - Call by reference. all function parameters must be pointers. every single one. π
- Column-major arrays. suppose a function returns an array with 5 rows and 3 columns in an array
zand in the call you have 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]
π§ User-supplied Function π§
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,fjrow,iflag)
integer m,n,iflag
double precision x(n),fvec(m),fjrow(n)
----------
if iflag = 1 calculate the functions at x and
return this vector in fvec. Do not alter fjac.
if iflag = i calculate row (i-1) of the
Jacobian at x and return this vector in fjrow.
----------
return
end
in C, fcn should be written as follows:
void fcn(int *m, int *n, double *x, double *fvec, double *fjrow,
int *iflag)
{
/* If iflag = 1 calculate the functions at x and return the
values in fvec[0] through fvec[m-1]. Do not alter fjac.
If iflag = i calculate row (i-1) of the Jacobian
at x and return the vector in fjrow. */
}
iflag is an input integer which specifies whether a function value or Jacobian row is to be calculated. π
β οΈ the value ofiflagshould not be changed byfcnβ unless you want to terminate execution oflmstr_(orlmstr1_). in that case, setiflagto a negative integer. that's your escape hatch, bestie, use it wisely π
π Parameters for both lmstr_ and lmstr1_ π
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. (rule is a rule β)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.fjrowβ an output array of lengthnwhich is set to one row of the Jacobian evaluated atx.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.
π Parameters for lmstr1_ π
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.info = 4βfvecis orthogonal to the columns of the Jacobian to machine precision.info = 5β number of calls tofcnhas reached or exceeded100*(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.
waβ a work array of lengthlwa.lwaβ an integer input variable not less thanm*n + 5*n + mforlmder1, or5*n+mforlmstr1_.
β Parameters for lmstr_ β
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.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.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 tofcnwithiflag = 1.njevβ an integer output variable set to the number of calls tofcnwithiflag = 2.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 π₯
lmdif(3), lmdif1(3), lmder(3), lmder1(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). absolute legends, fr fr π
and that's the whole page bestie!! π this one comes to you from Minpack, dated March 8, 2002 β so yes she's a vintage icon and she still slays πβ¨π¦ no cap, go minimize something.
π¦ 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