VB课程设计报告.docx
《VB课程设计报告.docx》由会员分享,可在线阅读,更多相关《VB课程设计报告.docx(28页珍藏版)》请在冰点文库上搜索。
VB课程设计报告
VisualBasic程序设计
课程设计报告
设计题目直线拟合
题目难度四星级
姓名蒋龙鑫
学号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
PrivateSubCommand1_Click()'显示第二个窗体
Form1.Hide
Form2.Show
Form3.Hide
zxnh=MsgBox("你必须完全输入所选的项目!
"&Chr(10)&Chr(13)&_
"否则程序将会出错!
",48,"直线拟合")
EndSub
PrivateSubCommand2_Click()'结束程序
End
EndSub
'使第二个窗体的文本框按照第一个窗体给出的数据组数显示
PrivateSubOption1_Click()
Form2.Label6.Enabled=False
Form2.Label7.Enabled=False
Form2.Label8.Enabled=False
Form2.Label9.Enabled=False
Form2.Label10.Enabled=False
Forn=6To10
Form2.Text1(n).Enabled=False
Form2.Text1(n).BackColor=&H8000000F
Form2.Text2(n).Enabled=False
Form2.Text2(n).BackColor=&H8000000F
Next
EndSub
PrivateSubOption2_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
Forn=7To10
Form2.Text1(n).Enabled=False
Form2.Text1(n).BackColor=&H8000000F
Form2.Text2(n).Enabled=False
Form2.Text2(n).BackColor=&H8000000F
Next
EndSub
PrivateSubOption3_Click()
Form2.Label6.Enabled=True
Form2.Label7.Enabled=True
Form2.Label8.Enabled=False
Form2.Label9.Enabled=False
Form2.Label10.Enabled=False
Forn=6To7
Form2.Text1(n).Enabled=True
Form2.Text1(n).BackColor=&HFFFFFF
Form2.Text2(n).Enabled=True
Form2.Text2(n).BackColor=&HFFFFFF
Next
Forn=8To10
Form2.Text1(n).Enabled=False·
Form2.Text1(n).BackColor=&H8000000F
Form2.Text2(n).Enabled=False
Form2.Text2(n).BackColor=&H8000000F
Next
EndSub
PrivateSubOption4_Click()
Form2.Label6.Enabled=True
Form2.Label7.Enabled=True
Form2.Label8.Enabled=True
Form2.Label9.Enabled=False
Form2.Label10.Enabled=False
Forn=6To8
Form2.Text1(n).Enabled=True
Form2.Text1(n).BackColor=&HFFFFFF
Form2.Text2(n).Enabled=True
Form2.Text2(n).BackColor=&HFFFFFF
Next
Forn=9To10
Form2.Text1(n).Enabled=False
Form2.Text1(n).BackColor=&H8000000F
Form2.Text2(n).Enabled=False
Form2.Text2(n).BackColor=&H8000000F
Next
EndSub
PrivateSubOption5_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
Forn=6To9
Form2.Text1(n).Enabled=True
Form2.Text1(n).BackColor=&HFFFFFF
Form2.Text2(n).Enabled=True
Form2.Text2(n).BackColor=&HFFFFFF
Next
EndSub
PrivateSubOption6_Click()
Form2.Label6.Enabled=True
Form2.Label7.Enabled=True
Form2.Label8.Enabled=True
Form2.Label9.Enabled=True
Form2.Label10.Enabled=True
Forn=6To10
Form2.Text1(n).Enabled=True
Form2.Text1(n).BackColor=&HFFFFFF
Form2.Text2(n).Enabled=True
Form2.Text2(n).BackColor=&HFFFFFF
Next
EndSub
窗体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:
OptionBase1
DimmAsInteger
DimX(10)AsSingle
DimY(10)AsSingle
PrivateSubCommand1_Click()'进入第三个绘图窗体
Form1.Hide
Form2.Hide
Form3.Show
DimAAsSingle'截距
DimBAsSingle'斜率
DimcAsSingle
DimdAsSingle
DimeAsSingle
DimfAsSingle
DimWAsSingle
DimRAsSingle
DimTAsSingle
'讨论点的个数
IfForm2.Text1(5).Enabled=TrueThenm=5
IfForm2.Text1(6).Enabled=TrueThenm=6
IfForm2.Text1(7).Enabled=TrueThenm=7
IfForm2.Text1(8).Enabled=TrueThenm=8
IfForm2.Text1(9).Enabled=TrueThenm=9
IfForm2.Text1(10).Enabled=TrueThenm=10
'对点的x.y坐标进行赋值
Ifm=5Then
Forn=1To5
X(n)=Text1(n).Text
Y(n)=Text2(n).Text
Next
EndIf
Ifm=6Then
Forn=1To6
X(n)=Text1(n).Text
Y(n)=Text2(n).Text
Next
EndIf
Ifm=7Then
Forn=1To7
X(n)=Text1(n).Text
Y(n)=Text2(n).Text
Next
EndIf
Ifm=8Then
Forn=1To8
X(n)=Text1(n).Text
Y(n)=Text2(n).Text
Next
EndIf
Ifm=9Then
Forn=1To9
X(n)=Text1(n).Text
Y(n)=Text2(n).Text
Next
EndIf
Ifm=10Then
Forn=1To10
X(n)=Text1(n).Text
Y(n)=Text2(n).Text
Next
EndIf
Forn=1Tom
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
'在坐标图上打印出点来
Forn=1Tom
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
'将超出坐标轴的线去掉
IfA>=0Then
Form3.Line(360,5400-37*A)-(4060,W)
IfW<1700ThenForm3.Line(R,