1 subroutine lmdif
(fcn
,m
,n
,x
,fvec
,ftol
,xtol
,gtol
,maxfev
,epsfcn
,
2 * diag
,mode
,factor
,nprint
,info
,nfev
,fjac
,ldfjac
,
3 * ipvt
,qtf
,wa1
,wa2
,wa3
,wa4
)
4 integer m
,n
,maxfev
,mode
,nprint
,info
,nfev
,ldfjac
6 double precision ftol
,xtol
,gtol
,epsfcn
,factor
7 double precision x
(n
),fvec
(m
),diag
(n
),fjac
(ldfjac
,n
),qtf
(n
),
8 * wa1
(n
),wa2
(n
),wa3
(n
),wa4
(m
)
14 c the purpose of lmdif is to minimize the sum of the squares of
15 c m nonlinear functions in n variables by a modification of
16 c the levenberg-marquardt algorithm. the user must provide a
17 c subroutine which calculates the functions. the jacobian is
18 c then calculated by a forward-difference approximation.
20 c the subroutine statement is
22 c subroutine lmdif(fcn,m,n,x,fvec,ftol,xtol,gtol,maxfev,epsfcn,
23 c diag,mode,factor,nprint,info,nfev,fjac,
24 c ldfjac,ipvt,qtf,wa1,wa2,wa3,wa4)
28 c fcn is the name of the user-supplied subroutine which
29 c calculates the functions. fcn must be declared
30 c in an external statement in the user calling
31 c program, and should be written as follows.
33 c subroutine fcn(m,n,x,fvec,iflag)
35 c double precision x(n),fvec(m)
37 c calculate the functions at x and
38 c return this vector in fvec.
43 c the value of iflag should not be changed by fcn unless
44 c the user wants to terminate execution of lmdif.
45 c in this case set iflag to a negative integer.
47 c m is a positive integer input variable set to the number
50 c n is a positive integer input variable set to the number
51 c of variables. n must not exceed m.
53 c x is an array of length n. on input x must contain
54 c an initial estimate of the solution vector. on output x
55 c contains the final estimate of the solution vector.
57 c fvec is an output array of length m which contains
58 c the functions evaluated at the output x.
60 c ftol is a nonnegative input variable. termination
61 c occurs when both the actual and predicted relative
62 c reductions in the sum of squares are at most ftol.
63 c therefore, ftol measures the relative error desired
64 c in the sum of squares.
66 c xtol is a nonnegative input variable. termination
67 c occurs when the relative error between two consecutive
68 c iterates is at most xtol. therefore, xtol measures the
69 c relative error desired in the approximate solution.
71 c gtol is a nonnegative input variable. termination
72 c occurs when the cosine of the angle between fvec and
73 c any column of the jacobian is at most gtol in absolute
74 c value. therefore, gtol measures the orthogonality
75 c desired between the function vector and the columns
78 c maxfev is a positive integer input variable. termination
79 c occurs when the number of calls to fcn is at least
80 c maxfev by the end of an iteration.
82 c epsfcn is an input variable used in determining a suitable
83 c step length for the forward-difference approximation. this
84 c approximation assumes that the relative errors in the
85 c functions are of the order of epsfcn. if epsfcn is less
86 c than the machine precision, it is assumed that the relative
87 c errors in the functions are of the order of the machine
90 c diag is an array of length n. if mode = 1 (see
91 c below), diag is internally set. if mode = 2, diag
92 c must contain positive entries that serve as
93 c multiplicative scale factors for the variables.
95 c mode is an integer input variable. if mode = 1, the
96 c variables will be scaled internally. if mode = 2,
97 c the scaling is specified by the input diag. other
98 c values of mode are equivalent to mode = 1.
100 c factor is a positive input variable used in determining the
101 c initial step bound. this bound is set to the product of
102 c factor and the euclidean norm of diag*x if nonzero, or else
103 c to factor itself. in most cases factor should lie in the
104 c interval (.1,100.). 100. is a generally recommended value.
106 c nprint is an integer input variable that enables controlled
107 c printing of iterates if it is positive. in this case,
108 c fcn is called with iflag = 0 at the beginning of the first
109 c iteration and every nprint iterations thereafter and
110 c immediately prior to return, with x and fvec available
111 c for printing. if nprint is not positive, no special calls
112 c of fcn with iflag = 0 are made.
114 c info is an integer output variable. if the user has
115 c terminated execution, info is set to the (negative)
116 c value of iflag. see description of fcn. otherwise,
117 c info is set as follows.
119 c info = 0 improper input parameters.
121 c info = 1 both actual and predicted relative reductions
122 c in the sum of squares are at most ftol.
124 c info = 2 relative error between two consecutive iterates
127 c info = 3 conditions for info = 1 and info = 2 both hold.
129 c info = 4 the cosine of the angle between fvec and any
130 c column of the jacobian is at most gtol in
133 c info = 5 number of calls to fcn has reached or
136 c info = 6 ftol is too small. no further reduction in
137 c the sum of squares is possible.
139 c info = 7 xtol is too small. no further improvement in
140 c the approximate solution x is possible.
142 c info = 8 gtol is too small. fvec is orthogonal to the
143 c columns of the jacobian to machine precision.
145 c nfev is an integer output variable set to the number of
148 c fjac is an output m by n array. the upper n by n submatrix
149 c of fjac contains an upper triangular matrix r with
150 c diagonal elements of nonincreasing magnitude such that
153 c p *(jac *jac)*p = r *r,
155 c where p is a permutation matrix and jac is the final
156 c calculated jacobian. column j of p is column ipvt(j)
157 c (see below) of the identity matrix. the lower trapezoidal
158 c part of fjac contains information generated during
159 c the computation of r.
161 c ldfjac is a positive integer input variable not less than m
162 c which specifies the leading dimension of the array fjac.
164 c ipvt is an integer output array of length n. ipvt
165 c defines a permutation matrix p such that jac*p = q*r,
166 c where jac is the final calculated jacobian, q is
167 c orthogonal (not stored), and r is upper triangular
168 c with diagonal elements of nonincreasing magnitude.
169 c column j of p is column ipvt(j) of the identity matrix.
171 c qtf is an output array of length n which contains
172 c the first n elements of the vector (q transpose)*fvec.
174 c wa1, wa2, and wa3 are work arrays of length n.
176 c wa4 is a work array of length m.
180 c user-supplied ...... fcn
182 c minpack-supplied ... dpmpar,enorm,fdjac2,lmpar,qrfac
184 c fortran-supplied ... dabs,dmax1,dmin1,dsqrt,mod
186 c argonne national laboratory. minpack project. march 1980.
187 c burton s. garbow, kenneth e. hillstrom, jorge j. more
190 integer i
,iflag
,iter
,j
,l
191 double precision actred
,delta
,dirder
,epsmch
,fnorm
,fnorm1
,gnorm
,
192 * one
,par
,pnorm
,prered
,p1
,p5
,p25
,p75
,p0001
,ratio
,
193 * sum
,temp
,temp1
,temp2
,xnorm
,zero
194 double precision dpmpar
,enorm
195 data one
,p1
,p5
,p25
,p75
,p0001
,zero
196 * /1.0d0
,1.0d
-1,5.0d
-1,2.5d
-1,7.5d
-1,1.0d
-4,0.0d0
/
198 c epsmch is the machine precision.
206 c check the input parameters for errors.
208 if (n
.le
. 0 .or
. m
.lt
. n
.or
. ldfjac
.lt
. m
209 * .or
. ftol
.lt
. zero
.or
. xtol
.lt
. zero
.or
. gtol
.lt
. zero
210 * .or
. maxfev
.le
. 0 .or
. factor
.le
. zero
) go to 300
211 if (mode
.ne
. 2) go to 20
213 if (diag
(j
) .le
. zero
) go to 300
217 c evaluate the function at the starting point
218 c and calculate its norm.
221 call fcn
(m
,n
,x
,fvec
,iflag
)
223 if (iflag
.lt
. 0) go to 300
224 fnorm
= enorm
(m
,fvec
)
226 c initialize levenberg-marquardt parameter and iteration counter.
231 c beginning of the outer loop.
235 c calculate the jacobian matrix.
238 call fdjac2
(fcn
,m
,n
,x
,fvec
,fjac
,ldfjac
,iflag
,epsfcn
,wa4
)
240 if (iflag
.lt
. 0) go to 300
242 c if requested, call fcn to enable printing of iterates.
244 if (nprint
.le
. 0) go to 40
246 if (mod
(iter
-1,nprint
) .eq
. 0) call fcn
(m
,n
,x
,fvec
,iflag
)
247 if (iflag
.lt
. 0) go to 300
250 c compute the qr factorization of the jacobian.
252 call qrfac
(m
,n
,fjac
,ldfjac
,.true
.,ipvt
,n
,wa1
,wa2
,wa3
)
254 c on the first iteration and if mode is 1, scale according
255 c to the norms of the columns of the initial jacobian.
257 if (iter
.ne
. 1) go to 80
258 if (mode
.eq
. 2) go to 60
261 if (wa2
(j
) .eq
. zero
) diag
(j
) = one
265 c on the first iteration, calculate the norm of the scaled x
266 c and initialize the step bound delta.
269 wa3
(j
) = diag
(j
)*x
(j
)
273 if (delta
.eq
. zero
) delta
= factor
276 c form (q transpose)*fvec and store the first n components in
283 if (fjac
(j
,j
) .eq
. zero
) go to 120
286 sum
= sum
+ fjac
(i
,j
)*wa4
(i
)
288 temp
= -sum
/fjac
(j
,j
)
290 wa4
(i
) = wa4
(i
) + fjac
(i
,j
)*temp
297 c compute the norm of the scaled gradient.
300 if (fnorm
.eq
. zero
) go to 170
303 if (wa2
(l
) .eq
. zero
) go to 150
306 sum
= sum
+ fjac
(i
,j
)*(qtf
(i
)/fnorm
)
308 gnorm
= dmax1
(gnorm
,dabs
(sum
/wa2
(l
)))
313 c test for convergence of the gradient norm.
315 if (gnorm
.le
. gtol
) info
= 4
316 if (info
.ne
. 0) go to 300
318 c rescale if necessary.
320 if (mode
.eq
. 2) go to 190
322 diag
(j
) = dmax1
(diag
(j
),wa2
(j
))
326 c beginning of the inner loop.
330 c determine the levenberg-marquardt parameter.
332 call lmpar
(n
,fjac
,ldfjac
,ipvt
,diag
,qtf
,delta
,par
,wa1
,wa2
,
335 c store the direction p and x + p. calculate the norm of p.
339 wa2
(j
) = x
(j
) + wa1
(j
)
340 wa3
(j
) = diag
(j
)*wa1
(j
)
344 c on the first iteration, adjust the initial step bound.
346 if (iter
.eq
. 1) delta
= dmin1
(delta
,pnorm
)
348 c evaluate the function at x + p and calculate its norm.
351 call fcn
(m
,n
,wa2
,wa4
,iflag
)
353 if (iflag
.lt
. 0) go to 300
354 fnorm1
= enorm
(m
,wa4
)
356 c compute the scaled actual reduction.
359 if (p1*fnorm1
.lt
. fnorm
) actred
= one
- (fnorm1
/fnorm
)**2
361 c compute the scaled predicted reduction and
362 c the scaled directional derivative.
369 wa3
(i
) = wa3
(i
) + fjac
(i
,j
)*temp
372 temp1
= enorm
(n
,wa3
)/fnorm
373 temp2
= (dsqrt
(par
)*pnorm
)/fnorm
374 prered
= temp1**2
+ temp2**2
/p5
375 dirder
= -(temp1**2
+ temp2**2
)
377 c compute the ratio of the actual to the predicted
381 if (prered
.ne
. zero
) ratio
= actred
/prered
383 c update the step bound.
385 if (ratio
.gt
. p25
) go to 240
386 if (actred
.ge
. zero
) temp
= p5
387 if (actred
.lt
. zero
)
388 * temp
= p5*dirder
/(dirder
+ p5*actred
)
389 if (p1*fnorm1
.ge
. fnorm
.or
. temp
.lt
. p1
) temp
= p1
390 delta
= temp*dmin1
(delta
,pnorm
/p1
)
394 if (par
.ne
. zero
.and
. ratio
.lt
. p75
) go to 250
400 c test for successful iteration.
402 if (ratio
.lt
. p0001
) go to 290
404 c successful iteration. update x, fvec, and their norms.
408 wa2
(j
) = diag
(j
)*x
(j
)
418 c tests for convergence.
420 if (dabs
(actred
) .le
. ftol
.and
. prered
.le
. ftol
421 * .and
. p5*ratio
.le
. one
) info
= 1
422 if (delta
.le
. xtol*xnorm
) info
= 2
423 if (dabs
(actred
) .le
. ftol
.and
. prered
.le
. ftol
424 * .and
. p5*ratio
.le
. one
.and
. info
.eq
. 2) info
= 3
425 if (info
.ne
. 0) go to 300
427 c tests for termination and stringent tolerances.
429 if (nfev
.ge
. maxfev
) info
= 5
430 if (dabs
(actred
) .le
. epsmch
.and
. prered
.le
. epsmch
431 * .and
. p5*ratio
.le
. one
) info
= 6
432 if (delta
.le
. epsmch*xnorm
) info
= 7
433 if (gnorm
.le
. epsmch
) info
= 8
434 if (info
.ne
. 0) go to 300
436 c end of the inner loop. repeat if iteration unsuccessful.
438 if (ratio
.lt
. p0001
) go to 200
440 c end of the outer loop.
445 c termination, either normal or user imposed.
447 if (iflag
.lt
. 0) info
= iflag
449 if (nprint
.gt
. 0) call fcn
(m
,n
,x
,fvec
,iflag
)
452 c last card of subroutine lmdif.