|
|
◆ Hybrd1()
| Sub Hybrd1 |
( |
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 (Jacobian not required) (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. Since the Jacobian is calculated by a forward difference approximation within the routine, the user is not required to provide the Jacobian.
Hybrd1 is the simple driver for standard use, which calls the Hybrd with default parameters.
- Parameters
-
| [in] | F | User supplied subroutine which calculates the functions fi(x) defined as follows. Sub F(N As Long, X() As Double, Fvec() As Double, IFlag As Long)
If IFlag = 1 or IFlag = 2:
Calculate the function values fi(x) at X() and return in Fvec() (i = 0 to n-1). Other 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 or 2 has reached the limit (200*(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 FHybrd(N As Long, X() As Double, Fvec() As Double, IFlag As Long)
If IFlag = 1 Or IFlag = 2 Then
Fvec(0) = X(0) ^ 2 - X(1) - 1
Fvec(1) = (X(0) - 2) ^ 2 + (X(1) - 0.5) ^ 2 - 1
End If
End Sub
Sub Ex_Hybrd1()
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 Hybrd1(AddressOf FHybrd, N, X(), Fvec(), XTol, Info)
Debug.Print "X1, X2 =", X(0), X(1)
Debug.Print "Info =", Info
End Sub
Sub Hybrd1(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 (Jacobian not required) (simple d...
- Example Results
X1, X2 = 1.06734608580669 0.139227666886861
Info = 0
|