📄 form1.frm
字号:
VERSION 5.00
Begin VB.Form Form1
Caption = "Form1"
ClientHeight = 3720
ClientLeft = 60
ClientTop = 450
ClientWidth = 4320
LinkTopic = "Form1"
ScaleHeight = 3720
ScaleWidth = 4320
StartUpPosition = 3 '窗口缺省
Begin VB.Frame Frame1
Height = 3015
Left = 240
TabIndex = 0
Top = 240
Width = 3735
Begin VB.TextBox Text6
BeginProperty Font
Name = "宋体"
Size = 10.5
Charset = 134
Weight = 700
Underline = 0 'False
Italic = 0 'False
Strikethrough = 0 'False
EndProperty
Height = 270
Left = 1560
TabIndex = 12
Top = 1920
Width = 1095
End
Begin VB.TextBox Text1
BeginProperty Font
Name = "宋体"
Size = 10.5
Charset = 134
Weight = 700
Underline = 0 'False
Italic = 0 'False
Strikethrough = 0 'False
EndProperty
Height = 255
Left = 1560
TabIndex = 6
Top = 1200
Width = 855
End
Begin VB.TextBox Text2
BeginProperty Font
Name = "宋体"
Size = 10.5
Charset = 134
Weight = 700
Underline = 0 'False
Italic = 0 'False
Strikethrough = 0 'False
EndProperty
Height = 255
Left = 1560
TabIndex = 5
Top = 1560
Width = 975
End
Begin VB.TextBox Text4
BeginProperty Font
Name = "宋体"
Size = 10.5
Charset = 134
Weight = 700
Underline = 0 'False
Italic = 0 'False
Strikethrough = 0 'False
EndProperty
Height = 270
Left = 1560
TabIndex = 4
Text = "2"
Top = 840
Width = 375
End
Begin VB.TextBox Text5
BeginProperty Font
Name = "宋体"
Size = 10.5
Charset = 134
Weight = 700
Underline = 0 'False
Italic = 0 'False
Strikethrough = 0 'False
EndProperty
Height = 270
Left = 2280
TabIndex = 3
Text = "2"
Top = 840
Width = 375
End
Begin VB.TextBox Text3
BeginProperty Font
Name = "宋体"
Size = 10.5
Charset = 134
Weight = 700
Underline = 0 'False
Italic = 0 'False
Strikethrough = 0 'False
EndProperty
Height = 270
Left = 1560
TabIndex = 2
Top = 2280
Width = 1935
End
Begin VB.Label Label1
Caption = "迭代精度"
BeginProperty Font
Name = "宋体"
Size = 12
Charset = 134
Weight = 700
Underline = 0 'False
Italic = 0 'False
Strikethrough = 0 'False
EndProperty
Height = 255
Index = 2
Left = 120
TabIndex = 11
Top = 1560
Width = 1455
End
Begin VB.Label Label1
Caption = "最优函数值"
BeginProperty Font
Name = "宋体"
Size = 12
Charset = 134
Weight = 700
Underline = 0 'False
Italic = 0 'False
Strikethrough = 0 'False
EndProperty
Height = 255
Index = 11
Left = 120
TabIndex = 10
Top = 1920
Width = 1455
End
Begin VB.Label Label1
Caption = "最优迭代点"
BeginProperty Font
Name = "宋体"
Size = 12
Charset = 134
Weight = 700
Underline = 0 'False
Italic = 0 'False
Strikethrough = 0 'False
EndProperty
Height = 255
Index = 10
Left = 120
TabIndex = 9
Top = 2280
Width = 1575
End
Begin VB.Label Label1
Caption = "初始迭代点"
BeginProperty Font
Name = "宋体"
Size = 12
Charset = 134
Weight = 700
Underline = 0 'False
Italic = 0 'False
Strikethrough = 0 'False
EndProperty
Height = 255
Index = 9
Left = 120
TabIndex = 8
Top = 840
Width = 1455
End
Begin VB.Label Label1
Caption = "迭代次数"
BeginProperty Font
Name = "宋体"
Size = 12
Charset = 134
Weight = 700
Underline = 0 'False
Italic = 0 'False
Strikethrough = 0 'False
EndProperty
Height = 255
Index = 0
Left = 120
TabIndex = 7
Top = 1200
Width = 1215
End
Begin VB.Label Label1
Caption = "DFP算法"
BeginProperty Font
Name = "宋体"
Size = 15
Charset = 134
Weight = 700
Underline = 0 'False
Italic = 0 'False
Strikethrough = 0 'False
EndProperty
Height = 375
Index = 1
Left = 120
TabIndex = 1
Top = 240
Width = 1215
End
End
End
Attribute VB_Name = "Form1"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = False
Private Sub Form_Load()
Dim X_k_0(1 To 2) As Double '定义变量Xk
Dim X_k_1(1 To 2) As Double '定义变量Xk+1
Dim Ⅴf_X_k_0(1 To 2) As Double '定义梯度Ⅴf(Xk)
Dim Ⅴf_X_k_1(1 To 2) As Double '定义梯度Ⅴf(Xk+1)
Dim g_k_0(1 To 2) As Double '梯度的另一表达形式
Dim g_k_1(1 To 2) As Double '梯度的另一表达形式
Dim Sk_0(1 To 2) '定义搜索方向
Dim Sk_1(1 To 2) '定义搜索方向
Dim δX_k_0(1 To 2) As Double
Dim δg_k_0(1 To 2) As Double
Dim H_k_0(1 To 2, 1 To 2)
Dim H_k_1(1 To 2, 1 To 2)
Dim iterative As Integer '定义迭代次数
Dim X1 As Double '定义自变量X1
Dim X2 As Double '定义自变量X2
Dim i As Integer '计数变量
Dim ε As Double
ε = 0.00005 '迭代精度
X_k_0(1) = Text4.Text '初始迭代点
X_k_0(2) = Text5.Text '初始迭代点
H_k_0(1, 1) = 1
H_k_0(1, 2) = 0
H_k_0(2, 1) = 0
H_k_0(2, 2) = 1
X1 = X_k_0(1)
X2 = X_k_0(2)
Ⅴf_X_k_0(1) = -1 + 2 * X2 + 2 * X1 '计算梯度
Ⅴf_X_k_0(2) = 1 + 2 * X1 + 6 * X2 '计算梯度
g_k_0(1) = Ⅴf_X_k_0(1)
g_k_0(2) = Ⅴf_X_k_0(2)
For i = 1 To 2
Sk_0(i) = -(H_k_0(i, 1) * g_k_0(1) + H_k_0(i, 2) * g_k_0(2)) '计算迭代方向
Next i
If (g_k_0(1) * g_k_0(1) + g_k_0(2) * g_k_0(2) < ε) Then
MsgBox ("迭代完毕!")
Else
For iterative = 1 To 1000 '开始迭代
Select Case iterative '确定λ的值
Case 1
λ = 0.5958
X_k_1(1) = X_k_0(1) + λ * Sk_0(1)
X_k_1(2) = X_k_0(2) + λ * Sk_0(2)
X1 = X_k_1(1)
X2 = X_k_1(2)
Ⅴf_X_k_1(1) = -1 + 2 * X2 + 2 * X1 '梯度表达式
Ⅴf_X_k_1(2) = 1 + 2 * X1 + 6 * X2 '梯度表达式
g_k_1(1) = Ⅴf_X_k_1(1)
g_k_1(2) = Ⅴf_X_k_1(2)
Case 2
λ = 1
δX_k_0(1) = X_k_1(1) - X_k_0(1)
δX_k_0(2) = X_k_1(2) - X_k_0(2)
δg_k_0(1) = g_k_1(1) - g_k_0(1)
δg_k_0(2) = g_k_1(2) - g_k_0(2)
H_k_1(1, 1) = H_k_0(1, 1) + δX_k_0(1) * δX_k_0(1) / (δX_k_0(1) * δg_k_0(1) + δX_k_0(2) * δg_k_0(2)) - δg_k_0(1) * δg_k_0(1) / (δg_k_0(1) * δg_k_0(1) + δg_k_0(2) * δg_k_0(2))
H_k_1(1, 2) = H_k_0(1, 2) + δX_k_0(1) * δX_k_0(2) / (δX_k_0(1) * δg_k_0(1) + δX_k_0(2) * δg_k_0(2)) - δg_k_0(1) * δg_k_0(2) / (δg_k_0(1) * δg_k_0(1) + δg_k_0(2) * δg_k_0(2))
H_k_1(2, 1) = H_k_0(2, 1) + δX_k_0(2) * δX_k_0(1) / (δX_k_0(1) * δg_k_0(1) + δX_k_0(2) * δg_k_0(2)) - δg_k_0(2) * δg_k_0(1) / (δg_k_0(1) * δg_k_0(1) + δg_k_0(2) * δg_k_0(2))
H_k_1(2, 2) = H_k_0(2, 2) + δX_k_0(2) * δX_k_0(2) / (δX_k_0(1) * δg_k_0(1) + δX_k_0(2) * δg_k_0(2)) - δg_k_0(2) * δg_k_0(2) / (δg_k_0(1) * δg_k_0(1) + δg_k_0(2) * δg_k_0(2))
For i = 1 To 2 '计算迭代方向
Sk_1(i) = -(H_k_1(i, 1) * g_k_1(1) + H_k_1(i, 2) * g_k_1(2))
Next i
X_k_1(1) = X_k_1(1) + λ * Sk_1(1) '计算新的迭代点
X_k_1(2) = X_k_1(2) + λ * Sk_1(2)
X1 = X_k_1(1)
X2 = X_k_1(2)
Ⅴf_X_k_1(1) = -1 + 2 * X2 + 2 * X1 '梯度表达式
Ⅴf_X_k_1(2) = 1 + 2 * X1 + 6 * X2 '梯度表达式
g_k_1(1) = Ⅴf_X_k_1(1)
g_k_1(2) = Ⅴf_X_k_1(2)
Case 3
End Select
If (g_k_1(1) * g_k_1(1) + g_k_1(2) * g_k_1(2) < ε) Then '判断是否达到迭代精度
f_X = -X1 + X2 + 2 * X1 * X2 + X1 * X1 + 3 * X2 * X2 '函数表达式
f_X_k_1 = f_X '计算Xk对应的函数值
MsgBox ("迭代完毕!")
Text1.Text = iterative '输出迭代次数
Text2.Text = Format(g_k_1(1) * g_k_1(1) + g_k_1(2) * g_k_1(2), "0.00000") '输出迭代精度
Text3.Text = Format(X1, "0.0000") & "," & Format(X2, "0.0000") '输出最优迭代点的值
Text6.Text = Format(f_X_k_1, "0.00000") '输出最优迭代点的函数值
Exit For
Else
End If
Next iterative
End If
End Sub
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -