《数值分析》课程设计题目分段线性插值学生牛彦坡陈彬冯梦雨指导教师郭阁阳-1-天津工程师范学院课程设计任务书理学院数学0702班学生牛彦坡陈彬冯梦雨课程设计课题:考察分段线性插值一、课程设计工作日自2009年6月22日至2009年6月28日二、同组学生:牛彦坡陈彬冯梦雨三、课程设计任务要求(包括课题来源、类型、目的和意义、基本要求、参考资料等):来源与意义:本课题来源于教材第二章插值法,目的是从几何意义掌握分段线性插值的思想,加深对其的理解以及掌握用计算机与Matlab解决相关问题的能力。基本要求:要求自编程序;掌握编程思想,学会一门编程语言;报告要有较强的理论分析;有较强说服力的数据表或图像;对结果进行分析;给出相应结论;鼓励创新;参考资料:1.数值分析,李庆扬,王能超,易大义,2001,清华大学出版社(第四版)。2.数值方法,关治,陆金甫,2006,清华大学出版社。3.数值分析与实验学习指导,蔡大用,2001,清华大学出版社。4.数值分析与实验,薛毅,2005,北京工业大学出版社。指导教师签字:教研室主任签字:-2-天津工程师范学院课程设计评审表理学院数学0702班学生牛彦坡陈彬冯梦雨设计任务完成情况及指导教师评语答辩情况评定成绩成绩:指导教师签字:日期:教研室主任:主任签字:日期:日期:-3-一、问题提出:考察分段线性插值:对21()1fxx在(-5,5)上进行分段线性插值,取不同节点个数n,得到不同分段线性插值函数。(要求:自编程序,报告有数据表、图像、分析、结论。)虽然matlab里有直接分段线形插值的函数,但为了对分段插值算法有更明确的理解,编写该程序是有必要的需要解决的问题:1、由已知数据节点编写分段线形插值函数,从而能由所编函数得到非节点的函数值。2、比较用不同节点数所得插值函数与真实函数的误差,从而得出节点数与插值效果的关系二、理论基础所谓分段线性插值就是通过插值点用折线段连接起来逼近f(x)。设已知节点a=x0x1…xn=b上的函数值f0,f1,…,fn,求一折线函数满足:1o],,[)(baCxIh2okhfxI)(),,1,0(nk,3o)(xIh在每个小区间[xk,xk+1]上是线性函数。则称)(xIh为分段线性插值函数。模型一:由定义可知)(xIh在每个小区间[xk,xk+1]上可表示为)(xIh=1111kkkkkkkkfxxxxfxxxx)(1kkxxx模型二:首先确定间隔序列k,使得:1kkxxx-4-第二个量是局部变量s,其定义为:kxxs最后一个量是一阶均差kkkkkxxyy11则插值基函数可表示为kkkkkkxxyyxxyxL11)()(kksy.三、实验内容1、模型一:用MATLAB分别建立m文件:(1)原函数fd1.m(2)分段线性插值函数fd2.m(3)比较不同节点数所得分段线性插值函数的插值效果fd3.m2、选取插值节点数为偶数在MATLAB窗口中执行:fd3n=2的数据见附录,图像如下:-5-4-3-2-101234500.51xy原函数(实线)-插值函数(虚线)-5-4-3-2-1012345-1-0.50xR(x)误差分析-5-n=8的图如下:-5-4-3-2-101234500.51xy原函数(实线)-插值函数(虚线)-5-4-3-2-1012345-0.4-0.200.20.4xR(x)误差分析n=20的图-5-4-3-2-101234500.51xy原函数(实线)-插值函数(虚线)-5-4-3-2-1012345-0.1-0.0500.050.1xR(x)误差分析-6-3、模型二:用MATLAB分别建立m文件:(1)分段插值函数fd22(2)插值效果比较函数fd32(选取插值节点数为奇数)程序代码(参见附录)在MATLAB窗口中执行:fd32得下图:上图为不同节点数插值函数图像与原函数图像,下图为误差图像-5-4-3-2-101234500.20.40.60.81-5-4-3-2-1012345-0.200.20.40.6n=3n=5n=7n=9n=11n=3n=5n=7n=9n=113、由上所有的图可看出,由于原函数是偶函数,等距节点所得插值函数有很强对称性,下任取节点,编写程序fd33.m,得图上图为不同节点数插值函数图像与原函数图像,下图为误差图像-7--5-4-3-2-101234500.20.40.60.81-5-4-3-2-1012345-1-0.500.5n=3n=5n=7n=9n=11n=3n=5n=7n=9n=114、比较不同节点所得插值函数与被插函数误差的平方和,程序模板为d1.m得下图:红星由fd32得奇数节点误差平方和,绿星加圈由fd3得偶数节点误差平方和,圈由f33得随机节点误差平方和,数据见附录0510152025020406080100120140n节点数e误差平方和-8-四、结果分析1、不同插值节点数所得的分段线形插值函数,在节点处与原函数的函数值一定相同2、所得的分段线形插值函数在原函数斜率绝对值变化大的地方,与原函数的误差比较大3、由误差平方和e,插值节点个数越多,e有减小的趋势,最后趋于0。单考虑奇数或偶数个节点,则随节点数增加e严格减小。4、随机生成的节点不如等距节点使插值效果好。五、结论插值节点个数越多,分段线形插值函数与原函数误差平方和有减小趋势,插值效果越好。六、参考文献《数值分析与实验》薛毅编著北京工业大学出版社附录代码如下:%fd1.m线性插值原函数functiony=fd1(x)y=1./(1+x.^2);%fd2.m分段线性插值函数functionyi=fd2(x,y,xi)n=length(x);m=length(y);ifn~=merror('X和Y向量的长度必须相同');return;end-9-fork=1:n-1ifabs(x(k)-x(k+1))eps%x(k)-x(k+1)的绝对值必须大于eerror('数据有误');return;endifx(k)=xi&xi=x(k+1)%保证x(k)xix(k+1)temp=x(k)-x(k+1);yi=(xi-x(k+1))/temp*y(k)+(xi-x(k))/(-temp)*y(k+1)return;endend%fd3.m比较插值效果a=-5;b=5;n=input('请输入分端节点数:');ifn=0error('你输入的数据有误!!!');break;endh=(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);fork1=1:m1z(k1)=fd2(x,y,xx(k1));endw=z-yyi;%计算误差subplot(2,1,1);plot(x,y,'o',xx,yyi,'-',x,y,'k:');%插值图像xlabel('x');ylabel('y');title('原函数(实线)-插值函数(虚线)');holdonsubplot(2,1,2);plot(xx,w,'k:');%误差的图像xlabel('x');ylabel('R(x)');-10-title('误差分析');holdonxx=xx';yyi=yyi';z=z';w=w';%fd22.m分段线性插值函数functionv=fd22(x,y,u)delta=diff(y)./diff(x);n=length(x);k=ones(size(u));forj=2:n-1k(x(j)=u)=j;ends=u-x(k);v=y(k)+s.*delta(k);%fd32.m同时画不同节点的插值函数图像和误差图像clearcloset=[-5:0.01:5];a=['k''g''r''c''m'];fori=1:5n=2*i+1;x=linspace(-5,5,n);%把区间[-55]分为(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));holdon;%画出插值函数图像及误差图像subplot(2,1,2);plot(t,e,a(i));holdon;endsubplot(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,[-55],'k');%画出原函数图像holdoff-11-%fd33.m插值节点非等分区间获得closet=[-5:0.01:5];a=['k''g''r''c''m'];fori=1:5n=2*i+1;x=[-5rand(1,n-2)*10-55];%得(-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));holdon;subplot(2,1,2);plot(t,e,a(i));holdon;endsubplot(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,[-55],'k');holdoff%fd1.m比较不同节点数误差平方和cleart=[-5:0.01:5];a=[];b=[];fori=1:10n=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=[ae];b=[bn];endplot(b,a,'go')xlabel('n节点数')ylabel('e误差平方和')holdonn=2的数据:-12-XYYI(原函数)W-5.00000.03850.03850-4.90000.04000.0577-0.0177-4.80000.04160.0769-0.0353-4.70000.04330.0962-0.0528-4.60000.04510.1154-0.0703-4.50000.04710.1346-0.0876-4.40000.04910.1538-0.1047-4.30000.05130.1731-0.1218-4.20000.05360.1923-0.1387-4.10000.05610.2115-0.1554-4.00000.05880.2308-0.1719-3.90000.06170.2500-0.1883-3.80000.06480.2692-0.2045-3.70000.06810.2885-0.2204-3.60000.07160.3077-0.2361-3.50000.07550.3269-0.2515-3.40000.07960.3462-0.2665-3.30000.08410.3654-0.2813-3.20000.08900.3846-0.2956-3.10000.09430.4038-0.3096-3.00000.10000.4231-0.3231-2.90000.10630.4423-0.336-2.80000.11310.4615-0.3484-2.70000.12060.4808-0.3601-2.60000.12890.5000-0.3711-2.50000.13790.5192-0.3813-2