📄 form1.frm
字号:
VERSION 5.00
Begin VB.Form Form1
Caption = "Form1"
ClientHeight = 3405
ClientLeft = 60
ClientTop = 450
ClientWidth = 4620
LinkTopic = "Form1"
ScaleHeight = 3405
ScaleWidth = 4620
StartUpPosition = 3 '窗口缺省
Begin VB.Frame Frame1
Height = 2895
Left = 240
TabIndex = 0
Top = 240
Width = 3975
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 = 1680
TabIndex = 7
Top = 2280
Width = 1695
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 = 2400
TabIndex = 6
Text = "1"
Top = 840
Width = 375
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 = 1680
TabIndex = 5
Text = "1"
Top = 840
Width = 375
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 = 1680
TabIndex = 4
Top = 1560
Width = 975
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 = 1680
TabIndex = 3
Top = 1200
Width = 615
End
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 = 1680
TabIndex = 2
Top = 1920
Width = 1335
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 = 1
Left = 240
TabIndex = 12
Top = 1200
Width = 1215
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 = 240
TabIndex = 11
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 = 10
Left = 240
TabIndex = 10
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 = 11
Left = 240
TabIndex = 9
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 = 2
Left = 240
TabIndex = 8
Top = 1560
Width = 1455
End
Begin VB.Label Label1
Caption = "Powell迭代法"
BeginProperty Font
Name = "宋体"
Size = 15
Charset = 134
Weight = 700
Underline = 0 'False
Italic = 0 'False
Strikethrough = 0 'False
EndProperty
Height = 375
Index = 0
Left = 240
TabIndex = 1
Top = 360
Width = 2415
End
End
End
Attribute VB_Name = "Form1"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = False
Dim f_x1_x2 As Double
Private Sub Form_Load()
Dim X_0(1 To 2) As Double '初始迭代点
Dim X_1(1 To 2) As Double '迭代点
Dim X_2(1 To 2) As Double '迭代点
Dim X_ζ(1 To 2) As Double '迭代点
Dim f_0 As Double 'x0点对应得函数值
Dim f_1 As Double 'x1点对应得函数值
Dim f_2 As Double 'x2点对应得函数值
Dim f_ζ As Double '(2*x2-x0)点对应得函数值
Dim S_1(1 To 2) '迭代方向s1
Dim S_2(1 To 2) '迭代方向s2
Dim λ0 As Double '迭代步长
Dim λ1 As Double '迭代步长
Dim λ2 As Double '迭代步长
Dim λζ As Double '迭代步长
Dim ε As Double '迭代精度
Dim δ As Double
Dim i As Integer
ε = 0.000001 '定义迭代精度
X_0(1) = Text4.Text '初始迭代点
X_0(2) = Text5.Text '初始迭代点
S_1(1) = 1 '初始迭代方向
S_1(2) = 0 '初始迭代方向
S_2(1) = 0 '初始迭代方向
S_2(2) = 1 '初始迭代方向
For iterative = 1 To 1000 '开始迭代
Call f(X_0(1), X_0(2)) '调用函数计算x0点处函数值
f_0 = f_x1_x2
Select Case iterative '确定步长
Case 1
λ0 = 2
λ1 = 1 / 2
λζ = 0.4
Case 2
λ0 = 0.2
λ1 = 0.08
λζ = 0.25
Case 3
λ0 = 0
λ1 = 0
λζ = 0
End Select
For i = 1 To 2 '确定迭代点x1
X_1(i) = X_0(i) + λ0 * S_1(i)
Next i
Call f(X_1(1), X_1(2)) '调用函数计算x1点处函数值
f_1 = f_x1_x2
For i = 1 To 2 '确定迭代点x2
X_2(i) = X_1(i) + λ1 * S_2(i)
Next i
Call f(X_2(1), X_2(2)) '调用函数计算x2点函数值
f_2 = f_x1_x2
If ((f_0 - f_1) > (f_1 - f_2)) Then '确定δ值
δ = f_0 - f_1
Else
δ = f_1 - f_2
End If
Call f((2 * X_2(1) - X_0(1)), (2 * X_2(2) - X_0(2))) '调用函数计算(2x2-x0)点函数值
f_ζ = f_x1_x2
If (((2 * X_2(1) - X_0(1)) - X_0(1)) * ((2 * X_2(1) - X_0(1)) - X_0(1)) + ((2 * X_2(2) - X_0(2)) - X_0(2)) * ((2 * X_2(2) - X_0(2)) - X_0(2)) < ε) Then '判断迭代是否完成
MsgBox ("迭代完毕!")
Text1.Text = iterative '输出迭代次数
Text2.Text = Format(((2 * X_2(1) - X_0(1)) - X_0(1)) * ((2 * X_2(1) - X_0(1)) - X_0(1)) + ((2 * X_2(2) - X_0(2)) - X_0(2)) * ((2 * X_2(2) - X_0(2)) - X_0(2)), "0.00000") '输出迭代精度
Text3.Text = Format((2 * X_2(1) - X_0(1)), "0.0000") & "," & Format((2 * X_2(2) - X_0(2)), "0.0000") '输出最优迭代点的值
Text6.Text = Format(f_ζ, "0.00000") '输出最优迭代点的函数值
Exit For
Else
If ((f_0 - 2 * f_2 + f_ζ) * (f_0 - f_2 - δ) * (f_0 - f_2 - δ) < (1 / 2 * δ * (f_0 - f_ζ) * (f_0 - f_ζ))) Then '判断是否改变迭代方向
For i = 1 To 2 '改变迭代方向
S_1(i) = S_2(i)
Next i
For i = 1 To 2
S_2(i) = X_2(i) - X_0(i)
Next i
For i = 1 To 2
X_ζ(i) = X_2(i) + λζ * S_2(i)
Next i
Call f(X_ζ(1), X_ζ(2)) '调用函数计算函数值
f_2 = f_x1_x2
For i = 1 To 2
X_0(i) = X_ζ(i)
Next i
Else '保持迭代方向不变
End If
End If
Next iterative
End Sub
Function f(X1, X2) '计算函数值
f_x1_x2 = X1 * X1 + 2 * X2 * X2 - 2 * X1 * X2 - 4 * X1
End Function
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -