实验报告
实验三 插值法与拟合实验
一、实验目的
1、懂得利用数据建模两种方法(插值法和拟合多项式法)对一批数据(x 1, y 1),
(x 2, y 2),……,(x n , y n )进行处理,学会对数据的结果进行误差分析.
2、比较分析这些方法的优缺点,并且在适合的场合应用相应的方法.
二、实验题目
1. 插值效果的比较
实验题目:将区间[-5, 5]10等分,对下列函数分别计算插值节点x k 的值,进行不同类型的插值,作出插值函数的图形并与y =f (x )的图形进行比较:
f x )=
11+x
2
; f (x )=a r c t a x n ; f (x )=
x
24
1+x
.
(1) 做拉格朗日插值; (2) 做三次样条插值. 2. 拟合多项式实验
实验题目:给定数据点如下表所示:
分别对上述数据作三次多项式和五次多项式拟合,并求平方误差,作出离散函数(x i , y i ) 和拟合函数的图形.
三、实验原理
数据建模有两大方法:一类是插值方法,要求所要函数ϕ(x )严格遵守从数
据(x 1, y 1),(x 2, y 2),……,(x n , y n );另一类是拟合方法,允许函数ϕ(x )在数据点上的有误差,但是要求达到某种误差指标的最小化.
第一题
⑴拉格朗日插值算法原理 %malagr.m
function yy=malagr(x,y,xx) %用途:拉格朗日插值法求解
%格式:yy=malagr(x,y,xx), x是节点向量,y 是节点对应的函数值向量, % xx是插值点(可以是多个),,yy 返回插值结果 m=length(x);n=length(y);
if m~=n, error('向量x 与y 的长度必须一致');end s=0; for i=1:n
t=ones(1,length(xx)); for j=1:n if j~=i
t=t.*(xx-x(j))/(x(i)-x(j)); end end
s=s+t*y(i); end yy=s; end
⑵三次样条插值算法原理: %maspline.m
function m=maspline(x,y,dy0,dyn,xx) %用途:三阶样条插值(一阶导数边界条件)
%格式:m=maspline(x,y,dy0,dyn,xx), x为节点向量,y 为数据, %dy0,dyn为左右两端点的一阶导数如果xx 缺省,则输出各节点的 %的一阶导数值,,m 为xx 的三阶样条插值
format short;
n=length(x)-1; %计算小区间的个数
h=diff(x); lambda=h(2:n)./(h(1:n-1)+h(2:n)); mu=1-lambda;
theta=3*(lambda.*diff(y(1:n))./h(1:n-1)+mu.*diff(y(2:n+1))./h(2:n)); theta(1)=theta(1)-lambda(1)*dy0; theta(n-1)=theta(n-1)-lambda(n-1)*dyn; %追赶法解散对焦方程组
dy=machase(lambda,2*ones(1:n-1),mu,theta); %若给插值点,计算插值 m=[dy0;dy;dyn]; if nargin>=5
s=zeros(size(xx)); for i=1:n if i==1
kk=find(xx
kk=find(xx>x(n)); else
kk=find(xx>x(i)&xx
xbar=(xx(kk)-x(i))/h(i);
s(kk)=alpha0(xbar)*y(i)+alpha1(xbar)*y(i+1)+... +h(i)*beta0(xbar)*m(i)+h(i)*beta1(xbar)*m(i+1); end m=s; end %追赶法
function x=machase(a,b,c,d) n=length(a);
for k=2:n
b(k)=b(k)-a(k)/b(k-1)*c(k-1); d(k)=d(k)-a(k)/b(k-1)*d(k-1); end
x(n)=d(n)/b(n); for k=n-1:-1:1
x(k)=(d(k)-c(k)*x(k+1))/b(k); end x=x(:); %基函数
function y=alpha0(x) y=2*x.^3-3*x.^2+1; function y=alpha1(x) y=-2*x.^3+3*x.^2; function y=beta0(x) y=x.^3-2*x.^2+x; function y=beta1(x) y=x.^3-x.^2;
第二题:多项式拟合算法原理: %mafit.m
function p=mafit(x,y,m) % 用途:多项式拟合
%格式:p=mafit(x,y,m), x, y为数据向量,m 为拟合多项式次数,p 返回 %多项式系数降幂排列 format short; A=zeros(m+1,m+1); for i=0:m for j=0:m
A(i+1,j+1)=sum(x.^(i+j)); end
b(i+1)=sum(x.^i.*y); end a=A\b';
p=fliplr(a'); %按降幂排列
四、实验内容
⑴第一个方程的程序: x=-5:0.1:5; y=1./(1+x.^2); plot(x,y,'r') hold on %拉格朗日插值 x1=-5:1:5; y1=1./(1+x1.^2); xx=-4.5:0.5:4.5; yy=malagr(x1,y1,xx); plot(xx,yy,'b*') %三次样条插值 dy0=-2*(-5)/(1+25); dyn=-2*5/(1+25);
m=maspline(x1,y1,dy0,dyn,xx); plot(xx,m,'ok')
⑵ 第二个方程的程序: x=-5:0.2:5; y=atan(x); plot(x,y,'r');
hold on %拉格朗日插值 x1=-5:1:5; y1=atan(x1); xx=-4.5:0.5:4.5; yy=malagr(x1,y1,xx); plot(xx,yy,'b*') %三次样条插值 dy0=1./(1+25); dyn=1./(1+25);
m=maspline(x1,y1,dy0,dyn,xx); plot(xx,m,'ok')
⑶第三个方程的程序: x=-5:0.1:5; y=x.^2./(1+x.^4); plot(x,y,'r') hold on %拉格朗日插值 x1=-5:1:5;
y1=x1.^2./(1+x1.^4); xx=-4.5:0.5:4.5; yy=malagr(x1,y1,xx);
plot(xx,yy,'b*') %三次样条插值
dy0=-2*(-5)*(1-5.^4)/(1+5.^4); dyn=-2*(5)*(1-5.^4)/(1+5.^4); m=maspline(x1,y1,dy0,dyn,xx); plot(xx,m,'ok')
axis([-5,5,-0.2,1])
第二题:多项式拟合程序:
x=[-1.5 -1.0 -0.5 0.0 0.5 1.0 1.5]'; y=[-4.45 -0.45 0.55 0.05 -0.44 0.54 4.55]'; plot(x,y,'or'); hold on %三次多项式拟合 p1=mafit(x,y,3); x1=-1.5:0.1:1.5;
y1=p1(1)*x1.^3+p1(2)*x1.^2+p1(3)*x1+p1(4); plot(x1,y1,'.-') %平方误差
y11=p1(1)*x.^3+p1(2)*x.^2+p1(3)*x+p1(4); err1=sum((y-y11).^2) %五次多项式拟合 p2=mafit(x,y,5); x1=-1.5:0.1:1.5;
y2=p2(1)*x1.^5+p2(2)*x1.^4+p2(3)*x1.^3+p2(4)*x1.^2+p2(5)*x1+p2(6); plot(x1,y2,'g') %平方误差
y22=p2(1)*x.^5+p2(2)*x.^4+p2(3)*x.^3+p2(4)*x.^2+p2(5)*x+p2(6);
err2=sum((y-y22).^2)
五、实验结果
第一题
⑴第一个方程的图形:
1.61.4
1.210.80.60.40.20-0.2-0.4-5
-4
-3
-2
-1
1
2
3
4
5
⑵第二个方程的图形:
1.5
1
0.5
-0.5
-1
-1.5-5
-4-3-2-1012345
⑶第三个方程的图形:
0.8
0.6
0.4
0.2
-0.2-5
-4-3-2-1012345
第二题:
平方误差:三次多项式拟合的平方误差:err1 =1.8571e-004
五次多项式拟合的平方误差:err2 =4.7727e-005
离散函数(x i , y i ) 和拟合函数的图形:
-1.5
-1
-0.5
0.5
1
1.5
六、 实验结果分析
1、由第一题的三个图可知:拉格朗日插值会出现很大的误差,即Runge 现象,运行的结果不好,但是三次样条插值法的效果就很好,误差很小,接近真实值. 2、由第二题的图像知,三次多项式拟合和五次多项式的拟合效果都很好. 比较三次多项式拟合的平方误差:err1 =1.8571e-004和五次多项式拟合的平方误差:err2 =4.7727e-005知五次多项式拟合比三次多项式拟合更加准确.