|
|
◆ Hybrj1()
| Sub Hybrj1 |
( |
F As |
LongPtr, |
|
|
N As |
Long, |
|
|
X() As |
Double, |
|
|
Fvec() As |
Double, |
|
|
XTol As |
Double, |
|
|
Info As |
Long |
|
) |
| |
Solution of a system of nonlinear equations by Powell hybrid method (simple driver)
- Purpose
- This routine 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.
Hybrj1 is the simple driver for standard use, which calls the Hybrj with default parameters.
- Parameters
-
| [in] | F | User supplied subroutine which calculates the functions fi(x) and the Jacobian defined as follows. Sub F(N As Long, X() As Double, Fvec() As Double, Fjac() As Double, IFlag As Long)
If IFlag = 1:
Calculate the function values fi(x) at X() and return in Fvec() (i = 0 to n-1). Other variables should not be changed.
If IFlag = 2:
Calculate the Jacobian matrix (dfi/dxj) and return in Fjac() (i = 0 to n-1, j = 0 to n-1). Other variables should not be changed.
If IFlag = 0:
If Nprint is set to positive value, F is called every Nprint iterations with IFlag = 0 for outputting intermediate result X() and Fvec(). Any variables should not be changed.
End Sub
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 - 1) (LX >= N)
[in] An initial estimate of the solution vector.
[out] The obtained solution vector. |
| [out] | Fvec() | Array Fvec(LFvec - 1) (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) |
| [out] | Info | = 0: Successful exit. (Relative error between two consecutive iterates is at most XTol)
= -2: The argument N had an illegal value. (N <= 0)
= -3: The argument X() is invalid.
= -4: The argument Fvec() is invalid.
= -5: The argument XTol had an illegal value. (XTol < 0)
= 1: Number of calls to F with IFlag = 1 has reached the limit (100*(N + 1)).
= 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 F with IFlag < 0). |
- Reference
- netlib/minpack
- Example Program
- Solve the following system of nonlinear equations.
x1^2 - x2 - 1 = 0
(x1 - 2)^2 + (x2 - 0.5)^2 - 1 = 0
The initial approximation (x1, x2) = (0, 0) is used. Sub FHybrj(N As Long, X() As Double, Fvec() As Double, Fjac() As Double, IFlag As Long)
If IFlag = 1 Then
Fvec(0) = X(0) ^ 2 - X(1) - 1
Fvec(1) = (X(0) - 2) ^ 2 + (X(1) - 0.5) ^ 2 - 1
ElseIf IFlag = 2 Then
Fjac(0, 0) = 2 * X(0)
Fjac(1, 0) = 2 * X(0) - 4
Fjac(0, 1) = -1
Fjac(1, 1) = 2 * X(1) - 1
End If
End Sub
Sub Ex_Hybrj1()
Const N = 2
Dim X(N - 1) As Double, Fvec(N - 1) As Double, XTol As Double, Info As Long
X(0) = 0: X(1) = 0
XTol = 0.0000000001 '1.0e-10
Call Hybrj1(AddressOf FHybrj, N, X(), Fvec(), XTol, Info)
Debug.Print "X1, X2 =", X(0), X(1)
Debug.Print "Info =", Info
End Sub
Sub Hybrj1(F As LongPtr, N As Long, X() As Double, Fvec() As Double, XTol As Double, Info As Long) Solution of a system of nonlinear equations by Powell hybrid method (simple driver)
- Example Results
X1, X2 = 1.06734608580669 0.139227666886861
Info = 0
|