黄金分割法
在进退法的基础上增加以下程序:
Private Sub HJfgf(X0() As Double, S() As Double, A As Double, B As Double, epslf As Double,
epslx As Double, n As Integer, aBest As Double, fmin As Double, x() As Double) '(黄金分割法子程序)
Const Q = 0.618
Dim j As Integer, i As Integer
Dim A1 As Double, A2 As Double
Dim f1 As Double, f2 As Double
' Dim x() As Double
' ReDim x(n)
j = 0
Do
j = j + 1
A1 = B - Q * (B - A)
For i = 1 To n
x(i) = X0(i) + A1 * S(i)
Next i
f1 = F(x())
A2 = A + Q * (B - A)
For i = 1 To n
x(i) = X0(i) + A2 * S(i)
Next i
f2 = F(x())
Do
If f1 > f2 Then
A = A1
A1 = A2
f1 = f2
A2 = A + Q * (B - A)
For i = 1 To n
x(i) = X0(i) + A2 * S(i)
Next i
f2 = F(x())
Else
B = A2
A2 = A1
f2 = f1
A1 = B - Q * (B - A)
For i = 1 To n
x(i) = X0(i) + A1 * S(i)
Next i
f1 = F(x())
End If
j = j + 1
If j > 50 Then Exit Do
Loop Until Abs((f2 - f1) / f2) <= epslf
If Abs((A2 - A1) / A1) > epslx Then
A = A1
B = A2
End If
Loop Until Abs((A2 - A1) / A1) <= epslx
If f1 < f2 Then
aBest = A1
fmin = f1
Else
aBest = A2
fmin = f2
End If
For i = 1 To n
x(i) = X0(i) + aBest * S(i) Next i
End Sub
Private Sub cmdHJ_click() '(主程序)
Dim T0 As Double
Dim epslf As Double, epslx As Double
Dim aBest As Double
Dim fmin As Double
Dim x() As Double
Dim i As Integer
n = 2
ReDim X0(1 To n), x(1 To n) ReDim S(1 To n)
X0(1) = 2
X0(2) = 2
S(1) = 0.707
S(2) = 0.707
epslf = 0.001
epslx = 0.001
T0 = 1
kf = 0
Call JinTui(X0, S, n, T0, A, B) MsgBox "A=" & A & "B=" & B & "kf=" & kf
Call HJfgf(X0, S, A, B, epslf, epslx, n, aBest, fmin, x)
MsgBox "aBest=" & aBest & "fmin=" & fmin & "kf=" & kf For i = 1 To n
MsgBox "x(" & i & ")=" & x(i)
Next i
End Sub