|
|
◆ lmder1()
| void lmder1 |
( |
void(*)(int, int, double *, double *, int, double *, int *) |
fcn, |
|
|
int |
m, |
|
|
int |
n, |
|
|
double |
x[], |
|
|
double |
fvec[], |
|
|
int |
ldfjac, |
|
|
double |
fjac[], |
|
|
double |
tol, |
|
|
int |
ipvt[], |
|
|
double |
work[], |
|
|
int |
lwork, |
|
|
int * |
info |
|
) |
| |
Nonlinear least squares approximation by Levenberg-Marquardt method (simple driver)
- Purpose
- lmder1 minimizes the sum of the squares of m nonlinear functions in n variables by a modification of the Levenberg-Marquardt algorithm.
minimize the sum of fi(x1, x2, ..., xn)^2 (sum for i = 1 to m)
The user must provide a subroutine which calculates the function values and the Jacobian.
lmder1 is equivalent to using lmder with setting ftol = tol, xtol = tol, gtol = 0, maxfev = 100*(n+1), mode = 1, factor = 100 and nprint = 0.
- Parameters
-
| [in] | fcn | User supplied subroutine which calculates the functions fi(x) and the Jacobian defined as follows. void fcn(int m, int n, double x[], double fvec[], int ldfjac, double fjac[][ldfjac], int *iflag)
{
If iflag = 1:
Calculate the function values fi(x) at x[] and return in fvec[i-1] (i = 1 to m). Other variables should not be changed.
If iflag = 2:
Calculate the Jacobian matrix (dfi/dxj) and return in fjac[] (i = 1 to m, j = 1 to n). Other variables should not be changed.
}
The value of iflag should not be changed unless the user wants to terminate the execution. In this case, set iflag to a negative integer. |
| [in] | m | Number of functions. (m > 0) |
| [in] | n | Number of variables. (0 < n <= m) |
| [in,out] | x[] | Array x[lx] (lx >= n)
[in] An initial estimate of the solution vector.
[out] The obtained solution vector. |
| [out] | fvec[] | Array fvec[lfvec] (lfvec >= m)
The function values evaluated at the solution vector x[]. |
| [in] | ldfjac | Leading dimension of the two dimensional array fjac[][]. (ldfjac >= m) |
| [out] | fjac[][] | Array fjac[lfjac][ldfjac] (lfjac >= n)
The upper n x n submatrix contains an upper triangular matrix R with diagonal elements of nonincreasing magnitude such that
P^T * (J^T * J)*P = R^T * R
where P is a permutation matrix and J is the final calculated Jacobian. |
| [in] | tol | Relative error desired in the sum of squares and the approximate solution. (tol >= 0) |
| [out] | ipvt[] | Array ipvt[lipvt] (lipvt >= n)
The pivot indices that define the permutation matrix P. |
| [out] | work[] | Array work[lwork]
Work array.
On return with info = 0, sub-code is set to work[0].
= 1: Both actual and predicted relative reductions in the sum of squares are at most ftol.
= 2: Relative error between two consecutive iterates is at most xtol.
= 3: Both of above are satisfied. |
| [in] | lwork | The length of work[]. (lwork >= 6*n + 2*m) |
| [out] | info | = 0: Successful exit (sub-code is set to work[0])
= -2: The argument m had an illegal value (m < n)
= -3: The argument n had an illegal value (n <= 0)
= -6: The argument ldfjac had an illegal value (ldfjac < m)
= -8: The argument tol had an illegal value (tol < 0)
= -11: The argument lwork had an illegal value (lwork too small)
= 1: Number of calls to fcn with iflag=1 has reached maxfev
= 2: ftol is too small. No further reduction in the sum of squares is possible
= 3: xtol is too small. No further improvement in the approximate solution x is possible
= 4: gtol is too small. fvec is orthogonal to the columns of the Jacobian to machine precision
= 5: User imposed termination (returned from fcn with iflag < 0) |
- Reference
- netlib/minpack
|