📄 form1.frm
字号:
VERSION 5.00
Begin VB.Form Form1
Caption = "三次样条"
ClientHeight = 3150
ClientLeft = 60
ClientTop = 345
ClientWidth = 7710
LinkTopic = "Form1"
ScaleHeight = 3150
ScaleWidth = 7710
StartUpPosition = 3 '窗口缺省
Begin VB.TextBox Text5
Height = 495
Left = 1440
TabIndex = 16
Text = "2.5"
Top = 2640
Width = 735
End
Begin VB.TextBox Text4
Height = 1095
Left = 0
TabIndex = 13
Text = "1,2,3,4,5;"
Top = 0
Width = 2775
End
Begin VB.CommandButton Command3
Caption = "About"
Height = 615
Left = 3720
TabIndex = 10
Top = 2520
Width = 615
End
Begin VB.CommandButton Command2
Caption = "End"
Height = 615
Left = 3120
TabIndex = 9
Top = 2520
Width = 615
End
Begin VB.CommandButton Command1
Caption = "Ok"
Height = 615
Left = 2520
TabIndex = 8
Top = 2520
Width = 615
End
Begin VB.TextBox Text3
Height = 495
Left = 720
TabIndex = 7
Top = 2640
Width = 735
End
Begin VB.TextBox Text2
Height = 495
Left = 0
TabIndex = 6
Top = 2640
Width = 735
End
Begin VB.OptionButton Option5
Caption = "曲率修正样条(首尾二阶导给定)"
Height = 615
Left = 4560
TabIndex = 5
Top = 2400
Width = 3135
End
Begin VB.OptionButton Option4
Caption = "抛物样条"
Height = 615
Left = 4560
TabIndex = 4
Top = 1800
Width = 3135
End
Begin VB.OptionButton Option3
Caption = "外差分样条"
Height = 615
Left = 4560
TabIndex = 3
Top = 1200
Width = 3135
End
Begin VB.OptionButton Option2
Caption = "自然样条(首尾节点值为0)"
Height = 615
Left = 4560
TabIndex = 2
Top = 600
Width = 3135
End
Begin VB.OptionButton Option1
Caption = "约束样条(首尾节点一阶导给定)"
Height = 615
Left = 4560
TabIndex = 1
Top = 0
Width = 3135
End
Begin VB.TextBox Text1
Height = 975
Left = 1920
TabIndex = 0
Text = "1,4,9,16,25;"
Top = 1080
Width = 2535
End
Begin VB.Label Label5
Caption = " x0"
Height = 495
Left = 1440
TabIndex = 17
Top = 2280
Width = 735
End
Begin VB.Label Label4
Caption = " 请将节点的y坐标输入到右方的输入框内"
BeginProperty Font
Name = "楷体_GB2312"
Size = 12
Charset = 134
Weight = 400
Underline = 0 'False
Italic = 0 'False
Strikethrough = 0 'False
EndProperty
Height = 855
Left = 0
TabIndex = 15
Top = 1200
Width = 1815
End
Begin VB.Label Label3
Caption = " 请将节点的x坐标输入到左方的输入框内"
BeginProperty Font
Name = "楷体_GB2312"
Size = 12
Charset = 134
Weight = 400
Underline = 0 'False
Italic = 0 'False
Strikethrough = 0 'False
EndProperty
Height = 1095
Left = 2880
TabIndex = 14
Top = 120
Width = 1575
End
Begin VB.Label Label2
Caption = "末节点一阶导数值"
Height = 495
Left = 720
TabIndex = 12
Top = 2160
Width = 735
End
Begin VB.Label Label1
Caption = "首节点一阶导数值"
Height = 495
Left = 0
TabIndex = 11
Top = 2160
Width = 735
End
End
Attribute VB_Name = "Form1"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = False
Private Sub Command1_Click()
Dim t1, t2 As Date
If Judge = 0 Then temp = MsgBox("请选择三次样条的种类!!", 48, "提示")
If Judge <> 0 Then
t1 = Time
w = 0
forward = 0
backward = 0
With Text4
l = Len(.Text)
For i = 1 To l
If Mid(.Text, i, 1) = "," Or Mid(.Text, i, 1) = ";" Then
forward = i
x0 = CDbl(Text5.Text)
x(w) = CInt(Mid(.Text, backward + 1, forward - backward - 1))
w = w + 1
backward = forward
End If
Next
End With
For i = 0 To w
Debug.Print x(i)
Next
w = 0
forward = 0
backward = 0
With Text1
l = Len(.Text)
For i = 1 To l
If Mid(.Text, i, 1) = "," Or Mid(.Text, i, 1) = ";" Then
forward = i
y(w) = CInt(Mid(.Text, backward + 1, forward - backward - 1))
w = w + 1
backward = forward
End If
Next
End With
w = w - 1
Call Cu_spine
For j = 1 To w
If x(j - 1) <= x0 And x(j) >= x0 Then
k = j - 1
Exit For
End If
Next
ans = x0 - x(k)
Debug.Print ans
t = S(k, 3) * ans + S(k, 2)
z = (t * ans + S(k, 1)) * ans + S(k, 0)
t2 = Time
Tm = CDbl(t2 - t1) * 24 * 3600
Form1.Hide
Form2.Show
End If
End Sub
Private Sub Form_Load()
Judge = 0
End Sub
Private Sub Option1_Click()
Label1.Caption = "首节点一阶导数值"
Label2.Caption = "末节点一阶导数值"
Text3.Enabled = True
Text2.Enabled = True
Text2.BackColor = &H80000005
Text3.BackColor = &H80000005
Judge = 1
End Sub
Private Sub Option2_Click()
Label1.Caption = "未使用"
Label2.Caption = "未使用"
Text3.Enabled = False
Text2.Enabled = False
Text2.BackColor = &H80000011
Text3.BackColor = &H80000011
Judge = 2
End Sub
Private Sub Option3_Click()
Label1.Caption = "未使用"
Label2.Caption = "未使用"
Text3.Enabled = False
Text2.Enabled = False
Text2.BackColor = &H80000011
Text3.BackColor = &H80000011
Judge = 3
End Sub
Private Sub Option4_Click()
Label1.Caption = "未使用"
Label2.Caption = "未使用"
Text3.Enabled = False
Text2.Enabled = False
Text2.BackColor = &H80000011
Text3.BackColor = &H80000011
Judge = 4
End Sub
Private Sub Option5_Click()
Label1.Caption = "首节点二阶导数值"
Label2.Caption = "末节点二阶导数值"
Text3.Enabled = True
Text2.Enabled = True
Text2.BackColor = &H80000005
Text3.BackColor = &H80000005
Judge = 5
End Sub
Private Sub Command2_Click()
End
End Sub
Private Sub Command3_Click()
temp = MsgBox("理学院一队:王元", 64, "关于:作者")
End Sub
Private Sub Cu_spine()
Dim H(Max), m(Max), d(Max), V(Max), a(Max), b(Max), c(Max), t, ss As Double
Dim z1, z2 As Double
H(0) = x(1) - x(0)
d(0) = (y(1) - y(0)) / H(0)
For k = 1 To w - 1
H(k) = x(k + 1) - x(k)
d(k) = (y(k + 1) - y(k)) / H(k)
a(k) = H(k)
b(k) = 2 * (H(k - 1) + H(k))
c(k) = H(k)
V(k) = 6 * (d(k) - d(k - 1))
Next k
Select Case Judge
Case 1:
z1 = CDbl(Text2.Text)
z2 = CDbl(Text3.Text)
b(1) = b(1) - H(0) / 2
t = d(0) - z1
V(1) = V(1) - 3 * t
b(w - 1) = b(w - 1) - H(w - 1) / 2
t = z2 - d(w - 1)
V(w - 1) = V(w - 1) - 3 * t
Case 2:
m(0) = 0
m(w) = 0
Case 3:
b(1) = b(1) + H(0) * H(0) / H(1)
c(1) = c(1) - H(0) * H(0) / H(1)
t = H(w - 1) * H(w - 1) / H(w - 2)
b(w - 1) = b(w - 1) + H(w - 1) + t
a(w - 2) = a(w - 2) + t
Case 4:
b(1) = b(1) + H(0)
b(w - 1) = b(w - 1) + H(w - 1)
Case 5:
z1 = CDbl(Text2.Text)
z2 = CDbl(Text3.Text)
V(1) = V(1) - H(0) * z1
V(w - 1) = V(w - 1) - H(w - 1) * z2
End Select
For k = 2 To w - 1
t = a(k - 1) / b(k - 1)
b(k) = b(k) - t * c(k - 1)
V(k) = V(k) - t * V(k - 1)
Next k
m(w - 1) = V(w - 1) / b(w - 1)
For k = w - 2 To 1 Step -1
m(k) = (V(k) - c(k) * m(k + 1)) / b(k)
Next k
Select Case Judge
Case 1:
t = (d(0) - z1) / H(0)
m(0) = 3 * t - m(1) / 2
t = (z2 - d(w - 1)) / H(w - 1)
m(w) = 3 * t - m(w - 2) / 2
Case 2:
m(0) = 0
m(w) = 0
Case 3:
t = (m(2) - m(1)) / H(1)
m(0) = m(1) - H(0) * t
ss = (m(w - 1) - m(w - 2)) / H(w - 2)
m(w) = m(w - 1) + H(w - 1) * ss
Case 4:
m(0) = m(1)
m(w) = m(w - 1)
Case 5:
m(0) = z1
m(w) = z2
End Select
For k = 0 To w - 1
S(k, 0) = y(k)
t = (2 * m(k) + m(k + 1)) / 6
S(k, 1) = d(k) - H(k) * t
S(k, 2) = m(k) / 2
S(k, 3) = (m(k + 1) - m(k)) / (6 * H(k))
Next k
End Sub
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -