利用最小二乘法求解拟合曲线
实验三函数逼近
1. 掌握数据多项式拟合的最小二乘法。
2. 会求函数的插值三角多项式。
二、实验问题
(1)由实验得到下列数据
(2)求函数f x =X2COSX在区间[-甌二]上的插值三角多项式。
三、实验要求
1. 利用最小二乘法求问题(1)所给数据的3次、4次拟合多项式,画出拟合曲线。
2
2. 求函数f X =X COSX在区间[-二,二]上的16次插值三角多项式,并画出插值多项式的图形,与f X的图形比较。
2
3. 对函数f X i = X COSX,在区间[-M,二]上的取若干点,将函数值作为数据进行适当
次数的最小二乘多项式拟合,并计算误差,与上题中的16次插值三角多项式的结果进行比较。
《数值分析》实验报告
【实验课题】
利用最小二乘法求上述问题所给数据的 2次,
3次、4次拟合多项式,画出拟合曲线
【实验目标】
(1) 加深对用最小二乘法求拟合多项式的理解 (2) 学会编写最小二乘法的数值计算的程序;
在函数的最佳平方逼近中f (X )?二C[a,b],如果f (X )只在一组离散点集
{xj =0,1, ,m}上给出,这就是科学实验中经常见到的实验数据
{(X j ,yj,i = 0,1,…,m}的
曲线拟合,这里y j=f(xji = 0,1; m,,要求一个函数y=S(x)与所给数据 T
{(X y ),= 0厂 1,m 拟合,若记误差 5i =S (xj — %(i =0,1,…,m) ,3 =?,d ,,酩),
设 0(x), 1(x),…,
:
n
(x)是 C[a,b]上的线性无关函数族,在
=span[ - 0(x), :1(x),…,::n (x)}中找一个函数S*(x),使误差平方和
这里
|S(x)二 a 。0(x) a [(x 「 a . :
n (x)(n :: m)
这就是一般的最小二乘逼近,用几何语言说,就称为曲线拟合的最小二乘法。 通常在最小二乘法中考虑加权平方和有
m
(J)八、(x):j
(x)匚(X ),
i=0 m
(f, :
k )八’(X i )f (X i ) l(x)二 d k ,k =0,1,…,n
i =e
上式可改写为
' (\, \)a^d k ,k =0,1,…,n 。
j :0
这个线性方程组称为法方程,可将其写成矩阵形式
Ga = d,
m
m
||、||;八、i 2 = <: [S (xj - y i ]
i =Q
i=0
PM :
[S(G-y i ]
=0
其中a -(a。?,…,aJ T,d =(doa,…,dJ T
伫0,%),(%严1),…,(%宀厂
伴,%),(%,%),…,(化巴)
G = ‘
*
1件卑),(咒,申1),…,(%,即』
求出a o,a i,…,a n
则拟合函数S* (x) = a。yx ? a2x2「…■■- a n x n
a=in v(G)*d
【实验问题】
利用最小二乘法求所给数据的2次、3次、4次拟合多项式,画出拟合曲线。【实验过程与结果】
编写程序后运行,n=2?3?4分别计算,得出结果和图像
(1)n=2 时
x=[0.0 0.1 0.2 0.3 0.5 0.8 1.0]'
y=[1.0 0.41 0.50 0.61 0.91 2.02 2.46]' n=2
p=leastsq(x,y,n)
I=lsp(p,t) 回车得到结果
0.7356
-1.2400
3.1316
所以拟合多项式为I =t*((18733*t)/5982 - 74179/59820) +
73337/99700
(2)n=3 时
x=[0.0 0.1 0.2 0.3 0.5 0.8 1.0]'
y=[1.0 0.41 0.50 0.61 0.91 2.02 2.46]' n=3
Apleastsq(x,y,n)
I=lsp(p,t) 回车得到结果
0.9266
-4.6591
12.8147
-6.6221
所以拟合多项式为I=0.9266 -4.6591t+3 12.8147
t A2+ -6.6221t A3;
(3)n=4 时
x=[0.0 0.1 0.2 0.3 0.5 0.8 1.0]'
y=[1.0 0.41 0.50 0.61 0.91 2.02 2.46]' n=4
p=leastsg(x,y,n)
I=lsq(p,t) 回车得到结果
A=
0.9427
-5.2987
16.2747
-12.3348
2.8853
附程序
1.Main
x=[0.0 0.1 0.2 0.3 0.5 0.8 1.0]'
y=[1.0 0.41 0.50 0.61 0.91 2.02 2.46]' syms t
n=2
p=leastsq(x,y,n) c=lsp(p,t) plot(x,y,'*')
2.
function p=leastsq(x,y,n) m=length(x);
G=zeros(n+1,n+1); b=zeros(n+1,1);
for i=0:n
for j=0:n
G(i+1,j+1)=(x.Ai)'*(x.Aj);
end
end
for k=0:n b(k+1,1)=(x.A k)'*y;
end
p=inv(G)*b;
3.
function I=lsp(p,t) m=length(p)-1; I=p(m+1);
for j=m:-1:1
I=I.*t+p(j);
end