|
|
◆ hybrj()
| void hybrj |
( |
void(*)(int, double *, double *, int, double *, int *) |
fcn, |
|
|
int |
n, |
|
|
double |
x[], |
|
|
double |
fvec[], |
|
|
double |
xtol, |
|
|
int |
maxfev, |
|
|
double |
diag[], |
|
|
int |
mode, |
|
|
double |
factor, |
|
|
int |
nprint, |
|
|
int * |
nfev, |
|
|
int * |
njev, |
|
|
double |
work[], |
|
|
int |
lwork, |
|
|
int * |
info |
|
) |
| |
Solution of a system of nonlinear equations by Powell hybrid method
- Purpose
- hybrj finds a zero of a system of n nonlinear functions in n variables
fi(x1, x2, ..., xn) = 0 (i = 1 to n)
by a modification of the Powell hybrid method.
The user must provide a subroutine which calculates the functions and the Jacobian.
- Parameters
-
| [in] | fcn | User supplied subroutine which calculates the functions fi(x) and the Jacobian defined as follows. void fcn(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] (i = 0 to n-1). Other variables should not be changed.
If iflag = 2:
Calculate the Jacobian matrix (dfi/dxj) and return in fjac[j][i] (i = 0 to n-1, j = 0 to n-1). Other variables should not be changed. ldfjac is the leading dimension of the two dimensional array.
If iflag = 0:
If nprint is set to positive value, fcn is called every nprint iterations with iflag = 0 for outputting intermediate result x[] and fvec[]. Any 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] | n | Number of functions and variables. (n > 0) |
| [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 >= n)
The function values evaluated at the solution vector x[]. |
| [in] | xtol | Target relative tolerance. Termination occurs when the relative error between two consecutive iterations is at most xtol. (xtol >= 0) |
| [in] | maxfev | Termination occurs when the number of calls to fcn with iflag = 1 has reached this value. (maxfev > 0) |
| [in,out] | diag[] | Array diag[ldiag] (ldiag >= n)
[in] If mode = 2, diag[] must contain positive entries that serve as multiplicative scale factors for the variables. (diag[i] > 0)
[out] If mode = 1, diag[] is set by the subroutine. |
| [in] | mode | = 1: The variables will be automatically scaled by the subroutine.
= 2: The scaling is specified by the input diag[].
(For other values, mode = 1 is assumed.) |
| [in] | factor | Used in determining the initial step bound. This bound is set to the product of factor and the Euclidean norm of diag*x if nonzero, or else to factor itself. In most cases factor should lie in the interval (0.1, 100). 100 is a generally recommended value. (factor > 0) |
| [in] | nprint | > 0: fcn is called with iflag = 0 at the beginning of the first iteration and every nprint iterations thereafter and at the end of last iteration for printing intermediate result.
<= 0: No special calls of fcn for printing intermediate results are made. |
| [out] | nfev | Number of function evaluations (number of calls to fcn with iflag = 1). |
| [out] | njev | Number of Jacobian evaluations (number of calls to fcn with iflag = 2). |
| [out] | work[] | Array work[lwork]
Work array. |
| [in] | lwork | The length of work[]. (lwork >= n*(3*n + 15)/2) |
| [out] | info | = 0: Successful exit (relative error between two consecutive iterates is at most xtol)
= -2: The argument n had an illegal value (n < 1)
= -5: The argument xtol had an illegal value (xtol < 0)
= -6: The argument maxfev had an illegal value (maxfev <= 0)
= -7: The argument diag had an illegal value (diag[i] <= 0 when mode = 2)
= -9: The argument factor had an illegal value (factor <= 0)
= -14: The argument lwork had an illegal value (lwork too small)
= 1: Number of calls to fcn with iflag = 1 has reached maxfev
= 2: xtol is too small. No further improvement in the approximate solution x is possible
= 3: Iteration is not making good progress, as measured by the improvement from the last five Jacobian evaluations
= 4: Iteration is not making good progress, as measured by the improvement from the last ten iterations
= 5: User imposed termination (returned from fcn with iflag < 0) |
- Reference
- netlib/minpack
|