XLPack 7.0
XLPack Numerical Library (Excel VBA) Reference Manual
Loading...
Searching...
No Matches

◆ 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]FUser 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]NNumber 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]XTolTarget 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