实验四 程序模型
一、实验目的
掌握程序模型的实现方法
二、实验内容
编制模型的计算机算法程序。 思考实现计算机算法的要求。
三、方案设计与要求
1、任选一个数学模型。
2、配置编程环境。
3、明确模型的人工解法,转变为计算机算法,进行必要的数据管理,并编程实现。
四、实验结果(结论)
1.数学模型
最小二乘法:一种数学优化技术,它通过最小化误差的平方和找到一组数据的最佳函数匹配。最小二乘法是用最简的方法求得一些绝对不可知的真值,而令误差平方之和为最小。最小二乘法通常用于曲线拟合。
设已知列表函数yi?f(xi)(i?0,1,?,m),并且我们想用一个通常的n(?m)次多项式去近似它。
pn(x)?a0?a1x???anxn---(1.1)
问题是应该如何选择a0,a1,?,an使pn(x)能较好地近似列表函数f(x)。按最小二乘法,应该选择a0,a1,?,an使得
S(a0,a1,?,an)??(f(xi)?pn(xi))2
i?0m取最小。注意到S是非负的,且是a0,a1,?,an的2次多项式,它必有最小值。 2.人工算法
求S对a0,a1,?,an的偏导数,并令其等于零,得到
?(yi?0mi?a0?a1xi???anxi)xi?0nk(k?0,1,?,n).
进一步,可以将它们写成
?yixi?a0?xi?a1?xikki?0i?0i?0mmmk?1???an?xii?0mk?n(k?0,1,?,n).
10
引进记号
sk??xi 和 uk??yixi,
kki?0i?0mm则上述方程组为
?s0a0?s1a1???snan?u0,?sa?sa???sa?u,?1021n?1n1 (1.3) ????????????????sna0?sn?1a1???s2nan?un.它的系数行列式是
s0Xn?1?s1?sns1s2?sn?1??sn?s2n.
?sn?1由si(i?0,1,?,2n)的定义及行列式性质,可以断言
Xn?1?1(W(?0,?1,?,?n))2. (1.4) ?(n?1)!此处符号W表Vandermonde行列式,而?是对所有可能的?i(i?0,1,?,n)求和(每个?i可
???j以取值x0,x1,?,xm,并且当i?j时i)。
由(1.4)式及Vandermonde行列式的性质可知,当x0,x1,?,xm互异时,
11?1?0?1??n W(?0,?1,?,?n)??02?12??n2?0.
????0n?1n??nn从而,Xn?1?0??0?,方程组?1.3?有唯一解a0,a1,?,an,且它们使?1.2?取极小值.如此,我们应用最小二乘法找到了f?x?的近似多项式pn?x?.
在利用最小二乘法组成和式?1.2?时,所有点xi都起到了同样的作用,但是有时依据某种理由认为?中的某些项的作用大些,而另外一些作用小些(例如,一些yi是由精度较高的仪器或操作上比较熟练的人员获得的,自然应该予以较大的信任),这在数学上表现为用和
11
2???????fx?px?inini i?0?i?1,??i通常称之为权;而?1.5?为加权和。 替代和?1.2?取最小值.?i?0,且i?1m
3.编程环境
在window7电脑系统,使用visual Basic 6.0编写调用程序。 4.详细计算机算法
使用vb输入数据控件模拟最小二乘法的二次多项式曲线拟合,以下是二次的算法解法:
2y?ax?bx?c 最小二乘法的二次多项式曲线拟合:
计算值?xi,yt?到实际值?xi,yi?的距离di
di?yt?yi?axi2?bxi?c?yi
误差的平方和为
Q??di2??(axi2?bxi?c?yi)2
求a、b、c使得Q的值最小。平方差Q大于0,因此函数存在大于或等于0的极小值,极小值为无穷大。
对a、b、c求偏导,令偏导等于0,得到极值点,比较所有极值点的函数值即可得到最小值。 ?Q??2?axi2?bxi?c?yi?xi2?0 ② ?a?Q??2?axi2?bxi?c?yi?xi?0 ③ ?b?Q??2?axi2?bxi?c?yi??0 ④ ?c解此方程组,先消去c
②*N - ④*
?x2i
N*?axi2?bxi?c?yixi2??axi2?bxi?c?yi*?xi2?0 N*?axi2?bxi?yixi2??axi2?bxi?yi*?xi2?0
?????????N?x??x*?x?a??N?x??x*?x?b???y*?x4i2i2i3ii2ii2i?N?xi2yi?0
?③*N - ④*
?x
iN*?axi2?bxi?c?yixi??axi2?bxi?c?yi*?xi?0 N*?axi2?bxi?yixi??axi2?bxi?yi*?xi?0
12
?????????N?x??x*?x?a??N?x??x*?x?b???y*?x?N?xy??0
3i2ii2iiiiiii令:
C?N?xi4??xi2*?xi2 D?N?xi3??xi*?xi2 E???????y*?xi2i?N?xi2yi
?G?N?xi2??xi*?xi H???yi*?xi?N?xiyi?
可解得
???Ca?Db?E?0 ??Da?Gb?H?0HD?EG
CG?D2HC?EDb?2
D?GCa?c??a?xi2?b?xi??yiN
2y?ax?bx?c。 最终拟合出来的结果二次多项式为
计算机算法:
1、输入所需解算的数据(也可用数据倒入数据);
2、运用最小二乘法处理数据,得到近似结果,并进行对结果的显示输出; 3、对模型计算得出的结果进行检验和评价。 5.完整源程序清单
在vb工程中,创有一个窗体,并在窗体上有一个按钮控件启动数据处理,以及一个文本控件来输入数据量。
Option Explicit
Private Sub Command1_Click()
Dim n As Integer, xy() As Double, i As Integer Dim a As Double, b As Double Form1.Cls
Print \从这开始计算!\If Text1.Text = \
MsgBox \请输入n的值!\注意\用文本框输入n的值!
13
Else
n = CInt(Text1.Text) If n <= 1 Then Exit Sub End If
ReDim xy(4, n)
Print \一共有\对数据!\For i = 1 To n
xy(1, i) = Val(InputBox(\自变量 X 的值:\ xy(2, i) = Val(InputBox(\因变量 Y 的值:\
xy(3, i) = xy(1, i) * xy(2, i) '求出每一对x与y的乘积 xy(4, i) = xy(1, i) ^ 2 '求出每一个x的平方值
Print \ xy(1, 0) = xy(1, 0) + xy(1, i) '所有x值的和' xy(2, 0) = xy(2, 0) + xy(2, i) '所有y值的和'
xy(3, 0) = xy(3, 0) + xy(3, i) 'x,y的乘积之和' xy(4, 0) = xy(4, 0) + xy(4, i) 'x的平方之和' Next i
a = (n* xy(3, 0) - xy(1, 0)* xy(2, 0)) / (n* xy(4, 0) - xy(1, 0) ^ 2) b = xy(2, 0) / n - a / n * xy(1, 0) '计算a,b的值 Print \拟合公式为:\
Print \ If a >= 0 Then Print \ Print a; \End Sub
Private Sub Form_Load()
Form1.AutoRedraw = True '运行界面 Form1.Caption = \最小二乘法拟合程序\ Print
Print \、输入数据数量;\
Print \、逐个输入各组数据;\
Print \、输出拟合公式。\ Print
Form1.Print \单击开始计算按钮运行...\End Sub
某组数据计算结果图:
14