《数值分析》课程设计
题目分段线性插值
学生牛彦坡陈彬冯梦雨指导教师郭阁阳
天津工程师范学院
课程设计任务书
理学院数学0702 班学生牛彦坡陈彬冯梦雨
课程设计课题:
考察分段线性插值
一、课程设计工作日自 2009 年 6 月 22 日至 2009 年 6 月 28 日
二、同组学生:牛彦坡陈彬冯梦雨
三、课程设计任务要求(包括课题来源、类型、目的和意义、基本要求、参考资
料等):
?来源与意义:
本课题来源于教材第二章插值法,目的是从几何意义掌握分段线性插值的思想,加深对其的理解以及掌握用计算机与Matlab解决相关问题的能力。
?基本要求:
要求自编程序;掌握编程思想,学会一门编程语言;报告要有较强的理论分析;有较强说服力的数据表或图像;对结果进行分析;给出相应结论;鼓励创新;
?参考资料:
1.数值分析,李庆扬,王能超,易大义,2001,清华大学出版社(第四版)。
2.数值方法,关治,陆金甫,2006,清华大学出版社。
3.数值分析与实验学习指导,蔡大用,2001,清华大学出版社。
4.数值分析与实验,薛毅,2005,北京工业大学出版社。
指导教师签字:教研室主任签字:
天津工程师范学院
课程设计评审表
理学院数学0702 班学生牛彦坡陈彬冯梦雨
一、 问题提出:
考察分段线性插值: 对2
1()1f x x
=
+在(-5,5)上进行分段线性插值,取不同节点个数n ,得到不同
分段线性插值函数。(要求:自编程序,报告有数据表、图像、分析、结论。) 虽然matlab 里有直接分段线形插值的函数,但为了对分段插值算法有更明确的理解,编写该程序是有必要的 需要解决的问题:
1、由已知数据节点编写分段线形插值函数,从而能由所编函数得到非节点的函数值。
2、比较用不同节点数所得插值函数与真实函数的误差,从而得出节点数与插值效果的关系
二、理论基础
所谓分段线性插值就是通过插值点用折线段连接起来逼近f (x )。设已知节点a=x 0 1o ],,[)(b a C x I h ∈ 2o k h f x I =)( ),,1,0(n k =, 3o )(x I h 在每个小区间[x k ,x k+1]上是线性函数。 则称)(x I h 为分段线性插值函数。 模型一:由定义可知)(x I h 在每个小区间[x k ,x k+1]上可表示为 ) (x I h = 111 1++++--+ --k k k k k k k k f x x x x f x x x x )(1+≤≤k k x x x 模型二:首先确定间隔序列k ,使得: 1+≤≤k k x x x 第二个量是局部变量s ,其定义为 : k x x s -= 最后一个量是一阶均差 k k k k k x x y y --= ++11δ 则插值基函数可表示为 k k k k k k x x y y x x y x L ---+=++11) ()(k k s y δ+=. 三、实验内容 1、模型一: 用MATLAB 分别建立m 文件: (1)原函数fd1.m (2)分段线性插值函数fd2.m (3)比较不同节点数所得分段线性插值函数的插值效果fd3.m 2、选取插值节点数为偶数 在MATLAB 窗口中执行:fd3 n=2的数据见附录,图像如下: -5 -4-3-2-1 012345 x y 原函数(实线)-插值函数(虚线) -5 -4-3-2-1 01234 5 -1-0.5 x R (x ) 误差分析 n=8的图如下: -5 -4-3-2-1 012345 x y 原函数(实线)-插值函数(虚线) -5 -4 -3 -2 -1 01 2 3 4 5 -0.4-0.200.20.4x R (x ) 误差分析 n=20的图 -5 -4-3-2-1 012345 x y 原函数(实线)-插值函数(虚线) -5 -4 -3 -2 -1 1 2 3 4 5 -0.1 -0.0500.05 0.1x R (x ) 误差分析 3、模型二:用MATLAB分别建立m文件: (1)分段插值函数fd22 (2)插值效果比较函数fd32(选取插值节点数为奇数) 程序代码(参见附录) 在MATLAB窗口中执行:fd32 得下图:上图为不同节点数插值函数图像与原函数图像,下图为误差图像 -5-4-3-2-1012345 -5-4-3-2-1012345 3、由上所有的图可看出,由于原函数是偶函数,等距节点所得插值函数有很强 对称性,下任取节点, 编写程序fd33.m,得图 上图为不同节点数插值函数图像与原函数图像,下图为误差图像 -5-4 -3 -2 -1 1 2 3 4 5 00.20.40.60.81-5 -4-3-2-1012345 -1-0.5 0.5 4、比较不同节点所得插值函数与被插函数误差的平方和,程序模板为d1.m 得下图: 红星由fd32得奇数节点误差平方和,绿星加圈由fd3得偶数节点误差平方和,圈由f33得随机节点误差平方和,数据见附录 20 40 60 80 100 120 140 n 节点数 e 误差平方和 四、结果分析 1、不同插值节点数所得的分段线形插值函数,在节点处与原函数的函数值一定相同 2、所得的分段线形插值函数在原函数斜率绝对值变化大的地方,与原函数的误差比较大 3、由误差平方和e,插值节点个数越多,e有减小的趋势,最后趋于0。单考虑奇数或偶数个节点,则随节点数增加e严格减小。 4、随机生成的节点不如等距节点使插值效果好。 五、结论 插值节点个数越多,分段线形插值函数与原函数误差平方和有减小趋势,插值效果越好。 六、参考文献 《数值分析与实验》薛毅编著北京工业大学出版社 附录 代码如下: % fd1.m线性插值原函数 function y=fd1(x) y=1./(1+x.^2); % fd2.m 分段线性插值函数 function yi=fd2(x,y,xi) n=length(x); m=length(y); if n~=m error('X和Y向量的长度必须相同'); return; end for k=1:n-1 if abs(x(k)-x(k+1)) return; end if x(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) return; end end % fd3.m 比较插值效果 a=-5; b=5; n=input('请输入分端节点数:'); if n<=0 error('你输入的数据有误!!!'); break; end h=(b-a)/(n-1); % 求节点 x=a:h:b; y=fd1(x); xx=a:0.1:b; % 用分段线性插值函数求非节点函数值 yyi=fd1(xx); m1=length(xx); z=zeros(1,m1); for k1=1:m1 z(k1)=fd2(x,y,xx(k1)); end w=z-yyi; % 计算误差 subplot(2,1,1);plot(x,y,'o',xx,yyi,'-',x,y,'k:');%插值图像xlabel('x'); ylabel('y'); title('原函数(实线)-插值函数(虚线)'); hold on subplot(2,1,2);plot(xx,w,'k:'); % 误差的图像 xlabel('x'); ylabel('R(x)'); title('误差分析'); hold on xx=xx'; yyi=yyi'; z=z'; w=w'; % fd22.m 分段线性插值函数 function v=fd22(x,y,u) delta=diff(y)./diff(x); n=length(x); k=ones(size(u)); for j=2:n-1 k(x(j)<=u)=j; end 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']; for i=1:5 n=2*i+1; x=linspace(-5,5,n); %把区间[-5 5]分为(n-1)份,算插值节点 y=fd1(x); p=fd22(x,y,t);p=p'; %计算以(x,y)为插值点的插值函数在t处的各个值y1=fd1(t);y1=y1'; e=p-y1; %计算误差 subplot(2,1,1);plot(x,y,a(i));hold on; %画出插值函数图像及误差图像subplot(2,1,2);plot(t,e,a(i));hold on; end subplot(2,1,1); legend('n=3','n=5','n=7','n=9','n=11') subplot(2,1,2); legend('n=3','n=5','n=7','n=9','n=11') subplot(2,1,1); fplot(@fd1,[-5 5],'k'); %画出原函数图像 hold off %fd33.m 插值节点非等分区间获得 close t=[-5:0.01:5]; a=['k''g''r''c''m']; for i=1:5 n=2*i+1; x=[-5 rand(1,n-2)*10-5 5]; %得(-5,5)上的n维随机向量x=sort(x); y=fd1(x); p=fd22(x,y,t);p=p'; y1=fd1(t);y1=y1'; e=p-y1; subplot(2,1,1);plot(x,y,a(i));hold on; subplot(2,1,2);plot(t,e,a(i));hold on; end subplot(2,1,1); legend('n=3','n=5','n=7','n=9','n=11') subplot(2,1,2); legend('n=3','n=5','n=7','n=9','n=11') subplot(2,1,1); fplot(@fd1,[-5 5],'k'); hold off %fd1.m 比较不同节点数误差平方和 clear t=[-5:0.01:5];a=[];b=[]; for i=1:10 n=2*i; %n=2*i+1则是奇数节点 x=linspace(-5,5,n) y=fd1(x); p=fd22(x,y,t); y1=fd1(t); e=p-y1; e=e*e'; a=[a e]; b=[b n]; end plot(b,a,'go') xlabel('n节点数') ylabel('e误差平方和') hold on n=2的数据: n234567 误差平方和136.920979.168963.334 6.977523.73840.8329 n891011121314误差平方和9.00150.5726 3.61520.572 1.56760.46480.7472 n15161718192021误差平方和0.33660.39450.23270.22910.15930.14380.1101