分段线性插值函数的编程实现Word文档格式.docx
《分段线性插值函数的编程实现Word文档格式.docx》由会员分享,可在线阅读,更多相关《分段线性插值函数的编程实现Word文档格式.docx(15页珍藏版)》请在冰豆网上搜索。
1、模型一:
用MATLAB分别建立m文件:
(1)原函数fd1.m
(2)分段线性插值函数fd2.m
(3)比较不同节点数所得分段线性插值函数的插值效果fd3.m
2、选取插值节点数为偶数
在MATLAB窗口中执行:
fd3n=2的数据见附录,图像如下:
n=8的图如下:
n=20的图
3、模型二:
用MATLAB分别建立m文件:
(1)分段插值函数fd22
(2)插值效果比较函数fd32(选取插值节点数为奇数)
源程序(参见附录).
fd32
得下图:
上图为不同节点数插值函数图像与原函数图像,下图为误差图像:
3、由上所有的图可看出,由于原函数是偶函数,等距节点所得插值函数有很强对称性,下任取节点,
编写程序fd33.m,得图.
上图为不同节点数插值函数图像与原函数图像,下图为误差图像:
4、比较不同节点所得插值函数与被插函数误差的平方和,程序模板为d1.m
得下图:
红星由fd32得奇数节点误差平方和,绿星加圈由fd3得偶数节点误差平方和,圈由f33得随机节点误差平方和,数据见附录.
4结果分析
1、不同插值节点数所得的分段线性插值函数,在节点处与原函数的函数值一定相同.
2、所得的分段线性插值函数在原函数斜率绝对值变化大的地方,与原函数的误差比较大.
3、由误差平方和e,插值节点个数越多,e有减小的趋势,最后趋于0.只考虑奇数或偶数个节点,则随节点数增加e严格减小.
4、随机生成的节点不如等距节点使插值效果好.
5结论
插值节点个数越多,分段线性插值函数与原函数误差平方和有减小趋势,插值效果越好.
参考文献
[1]李庆杨,王能超.数值分析.(第4版)[M].武汉:
华中科技大学出版社,2006:
13-24.
[2]肖筱南,赵来军.现代数值计算方法.[M].北京:
北京大学出版社,2003:
146-149.
[3]吴勃英,王德明.数值分析原理.[M].北京:
科学出版社,2003:
132-134.
[4]刘卫国编.MATLAB程序设计教程.[M].北京:
中国水利水电出版社,2001:
1-180.
[5]蔺小林,蒋耀林.现代数值分析.[M].北京:
国防工业出版社,2004:
184-186.
附录
程序如下:
%fd1.m线性插值原函数
functiony=fd1(x)
y=1./(1+x.^2);
%fd2.m分段线性插值函数
functionyi=fd2(x,y,xi)
n=length(x);
m=length(y);
ifn~=m
error('
X和Y向量的长度必须相同'
);
return;
end
fork=1:
n-1
ifabs(x(k)-x(k+1))<
eps%x(k)-x(k+1)的绝对值必须大于e
数据有误'
ifx(k)<
=xi&
xi<
=x(k+1)%保证x(k)<
xi<
x(k+1)
temp=x(k)-x(k+1);
yi=(xi-x(k+1))/temp*y(k)+(xi-x(k))/(-temp)*y(k+1)
%fd3.m比较插值效果
a=-5;
b=5;
n=input('
请输入分端节点数:
'
ifn<
=0
你输入的数据有误!
'
break;
h=(b-a)/(n-1);
%求节点
x=a:
h:
b;
y=fd1(x);
xx=a:
0.1:
%用分段线性插值函数求非节点函数值
yyi=fd1(xx);
m1=length(xx);
z=zeros(1,m1);
fork1=1:
m1
z(k1)=fd2(x,y,xx(k1));
w=z-yyi;
%计算误差
subplot(2,1,1);
plot(x,y,'
o'
xx,yyi,'
-'
x,y,'
k:
%插值图像
xlabel('
x'
ylabel('
y'
title('
原函数(实线)-插值函数(虚线)'
holdon
subplot(2,1,2);
plot(xx,w,'
%误差的图像
R(x)'
误差分析'
xx=xx'
;
yyi=yyi'
z=z'
w=w'
%fd22.m分段线性插值函数
functionv=fd22(x,y,u)
delta=diff(y)./diff(x);
k=ones(size(u));
forj=2:
k(x(j)<
=u)=j;
s=u-x(k);
v=y(k)+s.*delta(k);
%fd32.m同时画不同节点的插值函数图像和误差图像
clear
close
t=[-5:
0.01:
5];
a=['
k'
g'
r'
c'
m'
];
fori=1:
5
n=2*i+1;
x=linspace(-5,5,n);
%把区间[-55]分为(n-1)份,算插值节点
p=fd22(x,y,t);
p=p'
%计算以(x,y)为插值点的插值函数在t处的各个值
y1=fd1(t);
y1=y1'
e=p-y1;
%计算误差
plot(x,y,a(i));
holdon;
%画出插值函数图像及误差图像
plot(t,e,a(i));
end
legend('
n=3'
'
n=5'
n=7'
n=9'
n=11'
)
fplot(@fd1,[-55],'
%画出原函数图像
holdoff
%fd33.m插值节点非等分区间获得
x=[-5rand(1,n-2)*10-55];
%得(-5,5)上的n维随机向量
x=sort(x);
%fd1.m比较不同节点数误差平方和
a=[];
b=[];
10
n=2*i;
%n=2*i+1则是奇数节点
x=linspace(-5,5,n)
e=e*e'
a=[ae];
b=[bn];
plot(b,a,'
go'
n节点数'
e误差平方和'
n=2的数据:
X
Y
YI(原函数)
W
-5.0000
0.0385
-4.9000
0.0400
0.0577
-0.0177
-4.8000
0.0416
0.0769
-0.0353
-4.7000
0.0433
0.0962
-0.0528
-4.6000
0.0451
0.1154
-0.0703
-4.5000
0.0471
0.1346
-0.0876
-4.4000
0.0491
0.1538
-0.1047
-4.3000
0.0513
0.1731
-0.1218
-4.2000
0.0536
0.1923
-0.1387
-4.1000
0.0561
0.2115
-0.1554
-4.0000
0.0588
0.2308
-0.1719
-3.9000
0.0617
0.2500
-0.1883
-3.8000
0.0648
0.2692
-0.2045
-3.7000
0.0681
0.2885
-0.2204
-3.6000
0.0716
0.3077
-0.2361
-3.5000
0.0755
0.3269
-0.2515
-3.4000
0.0796
0.3462
-0.2665
-3.3000
0.0841
0.3654
-0.2813
-3.2000
0.0890
0.3846
-0.2956
-3.1000
0.0943
0.4038
-0.3096
-3.0000
0.1000
0.4231
-0.3231
-2.9000
0.1063
0.4423
-0.336
-2.8000
0.1131
0.4615
-0.3484
-2.7000
0.1206
0.4808
-0.3601
-2.6000
0.1289
0.5000
-0.3711
-2.5000
0.1379
0.5192
-0.3813
-2.4000
0.1479
0.5385
-0.3905
-2.3000
0.1590
0.5577
-0.3987
-2.2000
0.1712
0.5769
-0.4057
-2.1000
0.1848
0.596