vb课程设计报告(直线拟合)
直线拟合
一、功能
本题目重要是用于将实验中得到的具有线性特征的一组数据通过最小二乘法拟合成直线,求出其直线方程和绘制出该直线的图形。
二、详细设计
本题目的程序设计由三个窗体组成。
在Form1中,有1个框架控件、1个标签控件、2个命令按钮和1个由6个单选按钮组成的控件数组。单选按钮控件数组用来选择要输入的数据组数,当选择好后,单击“确定”按钮,就可以进入下一个窗体。单击“取消”按钮则退出程序
Form1的代码见附件。
在Form2中有2个命令按钮、20个文本框(每10个组成一个控件数组)、12个标签控件和许多直线组成。在文本框中输入实验数据后,点击“确定”按钮,若数据没有全部输入,则出现消息框,提醒没有完全输入。若已经完全输入,则显示Form3, 隐藏Form2。与此同时,对实验数据计算,得出拟合直线的截距和斜率,并在Form3的标签控件1中体现;根据所得的斜率和截距得到拟合直线方程,并在Form3的标签2中体现;还可以在Form3中绘出拟合直线和每个实验点(用绿色),根据实验数据调整坐标系统,画出拟合直线。 Form2的代码见附件。
三、调试
一开始,我是在三楼上机,用的是VB6.0,遇到的第一个问题是全局变量的设置问题。我不知道是我一个暑假把学的都忘了,最后终于在课本的帮助下成功做出来了。
第二个问题是显示拟合直线。一开始,我在Form3中画了一个图片框,运行时总显示不了直线,后来索性将它删掉,再次运行时终于能出现直线,可是直线的位置与设想相差太大了。连续尝试了1个多星期后,终于明白了,原来我直接利用得到的直线方程的点的坐标在窗体上画直线是不对的,因为我所画的坐标轴的单位长度和窗体的单位长度不相等,之间需要一定的转换。于是再次修改代码,可还是没有出现预想的情况。重新检查后,没有发现程序错误。我又尝试输入一组特殊数据:(1,3)、(2,5)、(3,7)、(4,9)、(5,11),它们的拟合直线应该是Y=2X+1,斜率是2,截距是1,可运行后的结果让我大吃一惊,斜率是-0.2,截距是-0.1。我再次检查了数据计算部分的代码,没有发现错误,请教了好几位同学也没有解决问题,如此又郁闷了一个星期。不知什么时候,心中有种感觉——书上有错误。找来大学物理实验课本,果不其然,在第三十七页找到类似的公式,经计算,终于发现课程设计课本上第211页 “令 M =(∑X i )
i =1m 2+m ∑X i ”中的“+”号应改为“-”。修改后,
i =1m 2
在调试过程中再也没出现什么大的问题。
四、输入输出数据
当选择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
五、课程设计总结
经过此次程序设计,使我对许多事情的看法有了改变。记得上学期学VB 的时候,感觉VB 很简单,老师布置的作业也很快完成,多余的时间就在偷偷玩游戏。刚知道自己要做直线拟合这道题时,翻了一下书,感觉很简单,相比选择难题的同学,我心中不免有些得意,心想:快速做完后,再做一个,说不定能得个优。刚开始事情就有点不顺,但也没什么大问题,一直到写完所有程序,开始运行的时候,才发觉最糟糕的事情出现了——运行中没有出现拟合直线,其他的问题都好办,可最终显示不出拟合直线就是失败,眼看着交作业的日子越来越近,心中却一点思绪都没有,而此时我又在金工实习,再加上二级考试的临近,我急得像热锅上的蚂蚁,不知怎么办才好。此时,我才真正体会到编写一个真正有用的程序是多
么的困难,那是要花上许多的心血才得来的。事情终于有了转机,在我弃用图片框后终于发现要显示满足要求的直线首先要进行坐标转换,窗体是以缇为单位,而平面直角坐标系以“1”为单位,二者需要转换。明白这一点之后,我终于能在窗体上显示出直线了,然而,并非我所期望的直线。我于是假设直线斜率为2,截距为1,得到一组数据,将它们输入Form2的文本框中,结果发现得到的直线斜率和截距不是2和1,而是0.02和0.01左右小的数字,我晕倒。检查一便代码后发觉与书上提供的公式相吻合,我没有错,可程序的运行结果却如此荒谬,难道注定我此次设计不合格,明年再来一次吗?后来,我终于对书本产生怀疑,正是这一怀疑给一切带来了生机,我找出大学物理实验课本,找到相关内容,终于发现程序设计课本错了,一个减号被打印成加号。找到问题所在后,一切便尽在掌握之中。
六、窗体图示
七.附件
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
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 = (e * c - f * d) / (c * c - m * d) '计算直线的截距
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
If W > 5400 And B
Form3.Line (360 + (5400 - 37 * A) / B, 5400)-(4060, W)
If W
If W > 5400 And B
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
Form 3:
' 结束程序
Private Sub Command1_Click() End
End Sub
' 重新开始且将FORM2的数据清空 Private Sub Command2_Click() Form1.Show
Form2.Hide
Form3.Hide
For n = 1 To 10
Form2.Text1(n).Text = "" Form2.Text2(n).Text = "" Next
End Sub