资源描述
Visual Basic程序设计
课程设计汇报
设计题目 直线拟合
题目难度 四星级
姓 名 蒋龙鑫
学 号 9141010F0309
指导老师 申 屠 德 忠
提交日期 4月15号
目 录
一、题目描述和功效要求 1
二、程序设计 1
(一)计算模型或算法实施 1
(二)模块设计(窗体界面和代码) 2
窗体1设计…………………………………………………………………………….3
窗体2设计 7
窗体3设计 12
三、算例演示 14
四、参考文件 15
五、课程设计总结 15
一、题目描述和功效要求
1题目描述
本题目关键是用于将试验中得到含有线性特征一组数据经过最小二乘法拟合成直线,求出其直线方程和绘制出该直线图形。也就是寻求一条直线使这些离散点尽可能平均在该直线两边,它对于寻求数据规律有很大帮助,是一个比较实用程序。
2功效要求:
(1)运行程序中,首先显示以下图窗体1“直线拟合”窗口,从中选择要拟合数据组数。单击“确定”按钮进入“数据输入”窗口。
(2)“数据输入”窗口中有10对文本框,用于输入最多10组试验数据。依据在“直线拟合”窗口选择不一样,这10对文本框只有指定数目标文本框可用。输入指定数据,然后单击“确定”按钮。假如数据未完全输入,则显示错误提醒消息框。
(3)假如数据输入正确,在“数据输入”窗口中单击“确定”按钮以后,程序进入“直线参数和图形”窗口,在此窗口中,程序依据输入数据自动计算拟合直线方程参数,并将系数和方程显示在窗口顶部。在窗口绘图区绘制直线图形。
二、程序设计
(一)计算模型或算法实施
假设试验中得到n个点,P1(X1,Y1),P2(X2,Y2),…,Pn(Xn,Yn),用i表示第i个点.因为多种误差存在,这些数据点不可能完全在一条直线上。假如我们能找到一条直线,使这n个点到该直线距离之平方和最小,则该直线就是用最小二乘法拟合出来直线。设拟合直线方程为F(X)=Y=bX+a,因为拟合出来直线斜率是固定,我们能够用每一个数据点和直线在Y方向上“残差”来定义,即残差ΔYi=F(Xi)-Yi,可得:
Σ(ΔYi)^2=Σ(F(Xi)-Yi)^2=Σ(bXi+a-Yi)^2
依据最小二乘法原理,Σ(bXi+a-Yi)^2取极小值时,即为残差最小,这时确定直线即为拟合直线。上式是一个二元函数求极值问题,可分别对自变量a和b求偏导数,可易得: na+bΣXi =ΣYi
aΣXi+bΣ(Xi)^2=Σ(XiYi)
从而得到公式:
由上公式可知,我们可用n个点坐标确定直线方程系数a和b,得到方程并将方程拟合出来.
本题目标程序设计由三个窗体组成。
在Form1中,有1个框架控件、1个标签控件、2个命令按钮和1个由6个单选按钮组成控件数组。单选按钮控件数组用来选择要输入数据组数,当选择好后,单击“确定”按钮,就能够进入下一个窗体。单击“取消”按钮则退出程序
Form1代码见附件。
在Form2中有2个命令按钮、20个文本框(每10个组成一个控件数组)、12个标签控件和很多直线组成。在文本框中输入试验数据后,点击“确定”按钮,若数据没有全部输入,则出现消息框,提醒没有完全输入。若已经完全输入,则显示Form3,隐藏Form2。和此同时,对试验数据计算,得出拟合直线截距和斜率,并在Form3标签控件1中表现;依据所得斜率和截距得到拟合直线方程,并在Form3标签2中表现;还能够在Form3中绘出拟合直线和每个试验点(用绿色),依据试验数据调整坐标系统,画出拟合直线。
Form2代码见附件。
(二)模块设计(窗体界面和代码)
本题目标程序设计由3个模块组成,其中窗体模块3个。
序号
模块名称
模块类型
模块功效
1
Form1
窗体模块
选择要输入数据组数,当选择好后,单击“确定”按钮,就能够进入下一个窗体;单击“取消”按钮则退出程序
2
Form2
窗体模块
输入试验数据后,对试验数据计算,得出拟合直线截距和斜率,依据所得斜率和截距得到拟合直线方程。
3
Form3
窗体模块
依据试验数据调整坐标系统,画出拟合直线。
窗体1设计
表1 窗体1中控件列表
序号
控件名称
控件类型
Left
Top
Width
Height
Caption
1
Label1
标签控件
1440
120
2055
375
直线拟合程序
2
Frame1
框架控件
480
600
3855
1455
请选择数据组数
3
Option1
单选框控件
360
360
975
255
5组
4
Option2
单选框控件
360
720
975
255
6组
5
Option3
单选框控件
360
1080
975
255
7组
6
Option4
单选框控件
2520
360
975
255
8组
7
Option5
单选框控件
2520
720
975
255
9组
8
Option6
单选框控件
2520
1080
975
255
10组
9
Command1
命令按钮控件
720
2280
1575
495
确定
10
Command2
命令按钮控件
2520
2280
1575
495
退出
表2 窗体1中事件过程列表
序号
事件过程
功效
1
Option1-click()
选择数据组数为5组
2
Option2-click()
选择数据组数为6组
3
Option3-click()
选择数据组数为7组
4
Option4-click()
选择数据组数为8组
5
Option5-click()
选择数据组数为9组
6
Option6-click()
选择数据组数为10组
7
Command1-click()
进入第二个窗体坐标轴输入
8
Command2-click()
退出拟合值线数据输入
表3 窗体1中通用过程和函数列表
序号
过程和函数
输入参数
输出参数
功效
1
MsgBox()
以文本向用户显示运行过程中信息,让用户单击按钮作选择
2
Chr()
10
换行符
使消息内容在中间某处换行
3
Chr()
13
回车符
窗体1代码
Form1
Private Sub Command1_Click() '显示第二个窗体
Form1.Hide
Form2.Show
Form3.Hide
zxnh = MsgBox("你必需完全输入所选项目!" & Chr(10) & Chr(13) & _
"不然程序将会犯错!", 48, "直线拟合")
End Sub
Private Sub Command2_Click() '结束程序
End
End Sub
'使第二个窗体文本框根据第一个窗体给出数据组数显示
Private Sub Option1_Click()
Form2.Label6.Enabled = False
Form2.Label7.Enabled = False
Form2.Label8.Enabled = False
Form2.Label9.Enabled = False
Form2.Label10.Enabled = False
For n = 6 To 10
Form2.Text1(n).Enabled = False
Form2.Text1(n).BackColor = &H8000000F
Form2.Text2(n).Enabled = False
Form2.Text2(n).BackColor = &H8000000F
Next
End Sub
Private Sub Option2_Click()
Form2.Label6.Enabled = True
Form2.Label7.Enabled = False
Form2.Label8.Enabled = False
Form2.Label9.Enabled = False
Form2.Label10.Enabled = False
Form2.Text1(6).Enabled = True
Form2.Text1(6).BackColor = &HFFFFFF
Form2.Text2(6).Enabled = True
Form2.Text2(6).BackColor = &HFFFFFF
For n = 7 To 10
Form2.Text1(n).Enabled = False
Form2.Text1(n).BackColor = &H8000000F
Form2.Text2(n).Enabled = False
Form2.Text2(n).BackColor = &H8000000F
Next
End Sub
Private Sub Option3_Click()
Form2.Label6.Enabled = True
Form2.Label7.Enabled = True
Form2.Label8.Enabled = False
Form2.Label9.Enabled = False
Form2.Label10.Enabled = False
For n = 6 To 7
Form2.Text1(n).Enabled = True
Form2.Text1(n).BackColor = &HFFFFFF
Form2.Text2(n).Enabled = True
Form2.Text2(n).BackColor = &HFFFFFF
Next
For n = 8 To 10
Form2.Text1(n).Enabled = False·
Form2.Text1(n).BackColor = &H8000000F
Form2.Text2(n).Enabled = False
Form2.Text2(n).BackColor = &H8000000F
Next
End Sub
Private Sub Option4_Click()
Form2.Label6.Enabled = True
Form2.Label7.Enabled = True
Form2.Label8.Enabled = True
Form2.Label9.Enabled = False
Form2.Label10.Enabled = False
For n = 6 To 8
Form2.Text1(n).Enabled = True
Form2.Text1(n).BackColor = &HFFFFFF
Form2.Text2(n).Enabled = True
Form2.Text2(n).BackColor = &HFFFFFF
Next
For n = 9 To 10
Form2.Text1(n).Enabled = False
Form2.Text1(n).BackColor = &H8000000F
Form2.Text2(n).Enabled = False
Form2.Text2(n).BackColor = &H8000000F
Next
End Sub
Private Sub Option5_Click()
Form2.Label6.Enabled = True
Form2.Label7.Enabled = True
Form2.Label8.Enabled = True
Form2.Label9.Enabled = True
Form2.Label10.Enabled = False
Form2.Text1(10).Enabled = False
Form2.Text1(10).BackColor = &H8000000F
Form2.Text2(10).Enabled = False
Form2.Text2(10).BackColor = &H8000000F
For n = 6 To 9
Form2.Text1(n).Enabled = True
Form2.Text1(n).BackColor = &HFFFFFF
Form2.Text2(n).Enabled = True
Form2.Text2(n).BackColor = &HFFFFFF
Next
End Sub
Private Sub Option6_Click()
Form2.Label6.Enabled = True
Form2.Label7.Enabled = True
Form2.Label8.Enabled = True
Form2.Label9.Enabled = True
Form2.Label10.Enabled = True
For n = 6 To 10
Form2.Text1(n).Enabled = True
Form2.Text1(n).BackColor = &HFFFFFF
Form2.Text2(n).Enabled = True
Form2.Text2(n).BackColor = &HFFFFFF
Next
End Sub
窗体2设计
表4 窗体2中控件列标
序号
控件名称
控件类型
Left
Top
Width
Height
Caption
1
Label1
标签控件
480
880
495
255
第1点
2
Label2
标签控件
480
1240
495
255
第2点
3
Label3
标签控件
480
1600
495
255
第3点
4
Label4
标签控件
480
1960
495
255
第4点
5
Label5
标签控件
480
2320
495
255
第5点
6
Label6
标签控件
480
2680
495
255
第6点
7
Label7
标签控件
480
3040
495
255
第7点
8
Label8
标签控件
480
3400
495
255
第8点
9
Label9
标签控件
480
3760
495
255
第9点
10
Label10
标签控件
480
4120
575
255
第10点
11
Label11
标签控件
1320
360
975
255
X坐标值:
12
Label12
标签控件
2520
360
975
255
Y坐标值:
13
Text1(1)
文本框控件
1440
840
735
270
14
Text1(2)
文本框控件
1440
1200
735
270
15
Text1(3)
文本框控件
1440
1560
735
270
16
Text1(4)
文本框控件
1440
1920
735
270
17
Text1(5)
文本框控件
1440
2280
735
270
18
Text1(6)
文本框控件
1440
2640
735
270
19
Text1(7)
文本框控件
1440
3000
735
270
20
Text1(8)
文本框控件
1440
3360
735
270
21
Text1(9)
文本框控件
1440
3720
735
270
22
Text1(10)
文本框控件
1440
4080
735
270
23
Text2(1)
文本框控件
2640
840
735
270
24
Text2(2)
文本框控件
2640
1200
735
270
25
Text2(3)
文本框控件
2640
1560
735
270
26
Text2(4)
文本框控件
2640
1920
735
270
27
Text2(5)
文本框控件
2640
2280
735
270
28
Text2(6)
文本框控件
2640
2640
735
270
29
Text2(7)
文本框控件
2640
3000
735
270
30
Text2(8)
文本框控件
2640
3360
735
270
31
Text2(9)
文本框控件
2640
3720
735
270
32
Text2(10)
文本框控件
2640
4080
735
270
33
Command1
命令按钮控件
480
4680
1335
495
确定
34
Command2
命令按钮控件
2040
4680
1335
495
返回
X1
Y1
X2
Y2
BorderStyle
BorderWidth
35
Line1
直线控件
240
240
3600
240
1-solid
1
36
Line2
直线控件
240
240
240
4440
1-solid
1
37
Line3
直线控件
3600
240
3600
4440
1-solid
1
38
Line4
直线控件
1200
240
1200
4440
1-solid
1
39
Line5
直线控件
2400
240
2400
4440
1-solid
1
40
Line6
直线控件
240
720
3600
720
1-solid
1
41
Line7
直线控件
240
4440
3600
4440
1-solid
1
42
Line8
直线控件
240
240
1200
720
1-solid
1
表5 窗体2中事件过程列表
序号
事件过程
功效
1
Command1-click()
进入绘图窗体,拟合成直线
2
Command2-click()
退出拟合直线数据输入
表6 窗体2中通用过程和函数列表
序号
过程和函数
输入参数
输出参数
功效
1
Spc()
3
3个空格组成字符串
返回number个空格组成字符串
窗体模块代码2
Form2:
Option Base 1
Dim m As Integer
Dim X(10) As Single
Dim Y(10) As Single
Private Sub Command1_Click() '进入第三个绘图窗体
Form1.Hide
Form2.Hide
Form3.Show
Dim A As Single '截距
Dim B As Single '斜率
Dim c As Single
Dim d As Single
Dim e As Single
Dim f As Single
Dim W As Single
Dim R As Single
Dim T As Single
'讨论点个数
If Form2.Text1(5).Enabled = True Then m = 5
If Form2.Text1(6).Enabled = True Then m = 6
If Form2.Text1(7).Enabled = True Then m = 7
If Form2.Text1(8).Enabled = True Then m = 8
If Form2.Text1(9).Enabled = True Then m = 9
If Form2.Text1(10).Enabled = True Then m = 10
'对点x.y坐标进行赋值
If m = 5 Then
For n = 1 To 5
X(n) = Text1(n).Text
Y(n) = Text2(n).Text
Next
End If
If m = 6 Then
For n = 1 To 6
X(n) = Text1(n).Text
Y(n) = Text2(n).Text
Next
End If
If m = 7 Then
For n = 1 To 7
X(n) = Text1(n).Text
Y(n) = Text2(n).Text
Next
End If
If m = 8 Then
For n = 1 To 8
X(n) = Text1(n).Text
Y(n) = Text2(n).Text
Next
End If
If m = 9 Then
For n = 1 To 9
X(n) = Text1(n).Text
Y(n) = Text2(n).Text
Next
End If
If m = 10 Then
For n = 1 To 10
X(n) = Text1(n).Text
Y(n) = Text2(n).Text
Next
End If
For n = 1 To m
c = X(n) + c
d = X(n) * X(n) + d
e = X(n) * Y(n) + e
f = Y(n) + f
Next
A = f/m-(m*e-c*f)*c/m/(m*d-c*c) '计算直线截距
B = (c * f - m * e) / (c * c - m * d) '计算直线斜率
'打印数据方程位置
Form3.CurrentX = 200
Form3.CurrentY = 350
Form3.Print "直线斜率(B)=" & B
Form3.CurrentX = 200
Form3.CurrentY = 580
Form3.Print "直线截距(A)=" & A
Form3.CurrentX = 200
Form3.CurrentY = 810
Form3.Print "直线方程为:"; Spc(3); "Y=" & B & "X+" & A
'在坐标图上打印出点来
For n = 1 To m
Form3.PSet (360 + 37 * X(n), 5400 - 37 * Y(n)), RGB(0, 0, 0)
Next
W = 5400 - 3700 * B - 37 * A
R = 360 + (3700 - 37 * A) / B
T = 360 - 37 * A / B
'将超出坐标轴线去掉
If A >= 0 Then
Form3.Line (360, 5400 - 37 * A)-(4060, W)
If W < 1700 Then Form3.Line (R, 1700)-(4060, W), &H8000000F
If W > 5400 And B < 0 Then Form3.Line (T, 5400)-(4060, W), &H8000000F
Else
Form3.Line (360 + (5400 - 37 * A) / B, 5400)-(4060, W)
If W < 1700 Then Form3.Line (R, 1700)-(4060, W), &H8000000F
If W > 5400 And B < 0 Then Form3.Line (T, 5400)-(4060, W), &H8000000F
End If
End Sub
'返回第一个窗体
Private Sub Command2_Click()
Form1.Show
Form2.Hide
Form3.Hide
For n = 1 To m
Text1(n).Text = ""
Text2(n).Text = ""
Next
End Sub
窗体3设计
表7 窗体3中控件列表
序号
控件名称
控件类型
Left
Top
Width
Height
Caption
1
Label1
标签控件
480
120
1455
255
直线参数(Y=BX+A
2
Label2
标签控件
1680
1320
1095
255
直线(Y-X)图
3
Label3
标签控件
3360
5160
975
135
坐标百分比:10:1
4
Label4
标签控件
170
1920
180
135
100
5
Label5
标签控件
220
3480
135
135
50
6
Label6
标签控件
240
5400
135
135
0
7
Label7
标签控件
2160
5445
135
135
50
8
Label8
标签控件
3960
5445
180
135
100
9
Command1
命令按钮控件
600
5760
1455
495
关闭
10
Command2
命令按钮控件
2400
5760
1455
495
返回
X1
Y1
X2
Y2
BorderWidth
BorderStyle
11
Line1
直线控件
480
195
120
195
1
1 - Solid
12
Line2
直线控件
1920
195
4560
195
1
1 - Solid
13
Line3
直线控件
120
195
120
1080
1
1 - Solid
14
Line4
直线控件
4560
195
4560
1080
1
1 - Solid
15
Line5
直线控件
120
1080
4560
1080
1
1 - Solid
16
Line6
直线控件
120
1200
4560
1200
1
1 - Solid
17
Line7
直线控件
120
1200
120
5640
1
1 - Solid
18
Line8
直线控件
360
1320
360
5400
1
1 - Solid
19
Line9
直线控件
360
1320
240
1560
1
1 - Solid
20
Line10
直线控件
360
1320
480
1560
1
1 - Solid
21
Line11
直线控件
360
5400
4440
5400
1
1 - Solid
22
Line12
直线控件
4560
1200
4560
5640
1
1 - Solid
23
Line13
直线控件
1200
5640
4560
5640
1
1 - Solid
24
Line14
直线控件
4440
5400
4200
5280
1
1 - Solid
25
Line15
直线控件
4440
5400
4200
5520
1
1 - Solid
226
Line16
直线控件
360
1700
420
1700
1
1 - Solid
27
Line17
直线控件
360
2070
420
2070
1
1 - Solid
28
Line18
直线控件
360
2440
420
2440
1
1 - Solid
29
Line19
直线控件
360
2810
420
2810
1
1 - Solid
30
Line20
直线控件
360
3180
420
3180
1
1 - Solid
31
Line21
直线控件
360
3550
420
3550
1
1 - Solid
32
Line22
直线控件
360
3920
420
3920
1
1 - Solid
33
Line23
直线控件
360
4290
420
4290
1
1 - Solid
34
Line24
直线控件
360
4660
420
4660
1
1 - Solid
35
Line25
直线控件
360
5030
420
5030
1
1 - Solid
36
Line26
直线控件
730
5340
730
5400
1
1 - Solid
37
Line27
直线控件
1100
5340
1100
5400
1
1 - Solid
38
Line28
直线控件
1470
5340
1470
5400
1
1 - Solid
39
Line29
直线控件
1840
5340
1840
5400
1
1 - Solid
40
Line30
直线控件
2210
5340
2210
5400
1
1 - Solid
41
Line31
直线控件
2580
5340
2580
5400
1
1 - Solid
42
Line32
直线控件
2950
5340
2950
5400
1
1 - Solid
43
Line33
直线控件
3320
5340
3320
5400
1
1 - Solid
44
Line34
直线控件
3690
5340
3690
5400
1
1 - Solid
45
Line35
直线控件
4060
5340
4060
5400
1
1 - Solid
表8 窗体3中事件过程列表
序号
事件过程
功效
1
Command1-click()
关闭程序,退出拟合直线
2
Command2-click()
退出拟合直线绘制过程,重新输入数据
窗体模块代码3
Form3:
Private Sub Command1_Click() '结束程序
End
End Sub
Private Sub Command2_Click() '重新开始且将FORM2数据清空
Form1.Show
Form2.Hide
Form3.Hide
For n = 1 To 10
Form2.Text1(n).Text = ""
Form2.Text2(n).Text = ""
Next
End Sub
三、算例演示
输入输出数据
当选择5组数据时,
Ⅰ:(54,76)、(65,83)、(87,89)、(82,61)、(34,22);
Ⅱ:(34,56)、(24,89)、(29,59)、(78,61)、(94,57);
Ⅲ:(58,26)、(44,77)、(55,89)、(67,65)、(76,98)。
运行结果:
Ⅰ:截距A=7.9171725,斜率B=0.9041657,直线方程为Y=0.9041657X+7.9171725,坐标百分比:×1
Ⅱ:截距A=74.72493,斜率B=-0.199323,直线方程为Y=74.7293X-0.199323,坐标百分比:×1
Ⅲ:截距A=41.1017,斜率B=-0.4983051,直线方程为Y=41.1017X+0.4983051,坐标百分比:×1
当选择6组数据时,
Ⅰ:(54,76)、(65,83)、(87,89)、(82,61)、(34,22)、(44,88);
Ⅱ:(34,56)、(24,89)、(29,59)、(78,61)、(94,57)、(44,88);
Ⅲ:(58,26)、(44,77)、(55,89)、(67,65)、(76,98)、(44,88)。
运行结果:
Ⅰ:截距A=33.64924,斜率B=0.5931818,直线方程为Y=0.5931818X+33.64924,坐标百分比:×1
Ⅱ:截距A=80.64387,斜率B=-0.2735675,直线方程为Y=-0.2735675X8+0.64387,坐标百分比:×1
Ⅲ:截距A=69.0728,斜率B=8.381743E-02,直线方程为Y=8.381743E-02X+69.0728,坐标百分比:×1
四、参考文件
1.王栋.Visual Basic程序设计实用教程(第2版).北京:清华大学出版社,1月
2.王栋.Visual Basic程序设计实用教程(第4版).北京:清华大学出版社,12月
五、课程设计总结
以前总认为编个程序其实应该蛮简单,可是,到了真正自己动手时候才发觉有多困难,才认为自己掌握是多么少。上个学期学很多东西全部不太记得了,只有重新端起书本,重新寻求遗忘知识点,从头开始。
三个窗体模块,显得有点复杂,首次看到时,长长代码,真有吓到我,不过,认真琢磨后才发觉,大部分全部是反复代码,只是有部分地方比较难懂。关键是最终面要经过最小二乘法算出拟合直线斜率和截距,最终表现在坐标轴上。刚开始看源代码时候,没有弄懂那个式子含义,高中也有学过最小二乘法,不过仿佛求斜率和截距方法不一样,然后在室友一起推敲和翻阅资料后,还是决定改掉代码,用高中学过知识重新做了一遍,经过几次验证尝试,最终确定了最终代码是正确。
还有一点漏洞,不一样点拟合出来直线斜率和截距不一样,有比较大,有比较小,理想中坐标轴是能够控制大小,改变坐标轴上单位
展开阅读全文