您好,欢迎访问三七文档
当前位置:首页 > 机械/制造/汽车 > 汽车理论 > 实验一--牛顿插值法
牛顿插值法一、实验目的(1)掌握牛顿插值法的基本思路和步骤;(2)培养编程与上机调试能力。二、算法描述(1)牛顿插值法基本思路给定插值点序列())(,iixfx,,,1,0,ni。构造牛顿插值多项式)(uNn。输入要计算的函数点,x并计算)(xNn的值,利用牛顿插值公式,当增加一个节点时,只需在后面多计算一项,而前面的计算仍有用;另一方面)(xNn的各项系数恰好又是各阶差商,而各阶差商可用差商公式来计算。(2)牛顿插值法计算步骤输入n值及())(,iixfx,,,1,0,ni;要计算的函数点x。对给定的,x由00010101201101()()(),()(),,()()(),,nnnNxfxxxfxxxxxxfxxxxxxxxxfxxx计算()nNx的值。(3)输出()nNx三、实验内容给定21()1fxx[5,5]x,取节点5(0,1,,10)kxkk,构造牛顿插值函数计算点50.5(0,1,,20)jtjj处10()Nx的值,并绘制图形与()fx比较。1)Newton插值公式源程序:clear;formatlong;way_in=input('请选择输入的内容(1或2):\n1、输入为f(x)表达式,区间[a,b]及其等分数n的值\n2、输入为f(x)表达式和插值点横坐标xi的值\n');switchway_incase1f=input('请输入函数表达式:f(x)=','s');a=input('请输入区间左端值a:');b=input('请输入区间右端值b:');n=input('请输入区间等分值n:');np=input('请输入插值函数在区间内绘图点数(默认输入100):');fori=1:n+1x(i)=a+(b-a)/n*(i-1);y(i,1)=eval(subs(f,'x(i)','x'));endforj=1:nfork=j:ntemp=y(k+1,j)-y(k,j);y(k+1,j+1)=temp/(x(k+1)-x(k+1-j));endc(j)=y(j,j);endc(j+1)=y(j+1,j+1);fork=1:np-1xx(k)=a+(b-a)/np*k;yy(k)=eval(subs(f,'xx(k)','x'));endfork=1:np-1xs=xx(k);fori=1:n+1ifi==1s(i)=c(i);elses(i)=c(i);forj=1:i-1s(i)=s(i)*(xs-x(j));endendendNn(k)=sum(s);endway_out=input('请选择要绘出的曲线(1、2或3):\n1、同时输出原始曲线f(x)和插值曲线\n2、只输出插值曲线\n3、只输出原始曲线\n');switchway_outcase1figure;plot(xx,yy,'r');gridon;holdon;plot(xx,Nn,'b');legend('原始曲线f(x)','插值曲线N(x)');title('牛顿插值');case2figure;plot(xx,Nn,'m');legend('插值曲线N(x)');title('牛顿插值');case3figure;plot(xx,yy,'g');legend('原始曲线f(x)');title('牛顿插值');otherwiseerrordlg('请正确选择,输入只能为1、2或者3!','提示','on');endcase2f=input('请输入函数表达式:f(x)=','s');xb=input('请输入插值节点的横坐标x:','s');x=sscanf(xb,'%f');disp('x0,x1,...,xi分别为:');disp(x);n=size(x,1)-1;ifn2errordlg('请至少输入3个xi的值','提示','on');return;endnp=input('请输入插值函数在区间内绘图点数(默认输入100):');a=x(1);b=x(n+1);fori=1:n+1y(i,1)=eval(subs(f,'x(i)','x'));endforj=1:nfork=j:ntemp=y(k+1,j)-y(k,j);y(k+1,j+1)=temp/(x(k+1)-x(k+1-j));endc(j)=y(j,j);endc(j+1)=y(j+1,j+1);fork=1:np-1xx(k)=a+(b-a)/np*k;yy(k)=eval(subs(f,'xx(k)','x'));endfork=1:np-1xs=xx(k);fori=1:n+1ifi==1s(i)=c(i);elses(i)=c(i);forj=1:i-1s(i)=s(i)*(xs-x(j));endendendNn(k)=sum(s);endway_out=input('请选择要绘出的曲线(1、2或3):\n1、同时输出原始曲线f(x)和插值曲线\n2、只输出插值曲线\n3、只输出原始曲线\n');switchway_outcase1figure;plot(xx,yy,'r');gridon;holdon;plot(xx,Nn,'b');legend('原始曲线f(x)','插值曲线N(x)');title('牛顿插值');case2figure;plot(xx,Nn,'m');legend('插值曲线N(x)');title('牛顿插值');case3figure;plot(xx,yy,'g');legend('原始曲线f(x)');title('牛顿插值');otherwiseerrordlg('请正确选择,输入只能为1、2或者3!','提示','on');endotherwiseerrordlg('请正确选择,输入只能为1或2!','提示','on');end2)输入指令如图所示:3)原始图形和插值图像截屏如下:四.实验分析与心得体会分析:由程序可知,当插值节点个数变化时,Newton插值多项式的结构不改变,插值多项式易于构造。只要给定插值函数,插值区间,插值节点,就可以很容易的得出插值多项式及其图像。另外,随着n的增大,插值精度逐渐提高,但并不是插值节点越多逼近精度越高,因为随着节点数目的增加导致插值多项式的次数增高,而高次多项式的振荡次数增多可能使插值多项式在非节点处的误差变得很大。当n值很大时,图像两边与原函数偏离较大。体会:由于我们没有学过matlab,能够完成此次实验实属不易,在完成的过程中查阅了一些图书,也参考了一部分资料,通过此次实验,培养了我们独立作业能力和编程能力!
本文标题:实验一--牛顿插值法
链接地址:https://www.777doc.com/doc-5029248 .html