插值法的程序实现

上传人:ba****u6 文档编号:110647310 上传时间:2022-06-19 格式:DOCX 页数:6 大小:18.67KB
返回 下载 相关 举报
插值法的程序实现_第1页
第1页 / 共6页
插值法的程序实现_第2页
第2页 / 共6页
插值法的程序实现_第3页
第3页 / 共6页
亲,该文档总共6页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
插值法的程序实现2. 实验目的1.熟悉Matlab编程;学习插值方法及程序设计算法一 实验题目分别用拉格朗日插值、牛顿插值、自然样条函数对1910、1965、2002的人口进行估算。 实验原理与理论基础拉格朗日插值算法设计利用已知条件得到xi,yi,i=0,1,2,. 由Lk(x)=(x-xO)*(x-x(kT)*(x-x(k+l)(x-xn)/(xk-xO)*(xk-x(k-l)*(xk-x(k+l)(xk-xn)得出Li(x);由Y=y1*L1(x)+yn*Ln(x)得出Y关于x的表达式。 带值计算即可。 牛顿插值算法设计利用已知条件得到xi,yi,i=0,1,2,.利用差商公式fxO,xk=(fxO,,x(k-2),xk-fx0,,x(k-1)/(xk-x(kT)各阶差商。利用牛顿插值公式f(x)二f(xO)-fxO,x1*(x-xO)+fxO,x1,xn*(x-xO)*(x-x(n-l). 带值计算即可。 自然样条函数算法设计利用已知条件得到xi,yi,i=0,1,2,. 利用公式求出h(i)u(i)k(i);di;利用h(i)u(i)k(i);di解出向量M;将相关变量带入自然样条表达式中即可。 带值计算即可。实验内容(一)问题重述:面给出美国从1920年到1970年的人口表年份192019301940195019601970人口(千人)1057111232031316691506971793232032121.用表中数据构造一个5次拉格朗日插值多项式,并用此估计1910,1965和2002年的人口。在1910年的实际人口约为91772000,请判断插值计算得到的1965年和2002年的人口数据准确性是多少?2用牛顿插值估计:(1)1965年的人口数;(2)2002年的人口数。3用自然样条函数估计在1910,1965和2002年的人口数。请比较以上三种方法所求值的效果。那一种方法最优?(二)实验代码:1.用matlab编写的拉格朗日插值M文件如下:functionm,y=cz5(x)y1=105711;y2=123203;y3=131669;y4=150697;y5=179323;y6=203212;x1=1920;x2=1930;x3=1940;x4=1950;x5=1960;x6=1970;a1=(x-x2)*(x-x3)*(x-x4)*(x-x5)*(x-x6)/(x1-x2)*(x1-x3)*(x1-x4)*(x1-x5)*(x1-x6);a2=(x-x1)*(x-x3)*(x-x4)*(x-x5)*(x-x6)/(x2-x1)*(x2-x3)*(x2-x4)*(x2-x5)*(x2-x6);a3=(x-x1)*(x-x2)*(x-x4)*(x-x5)*(x-x6)/(x3-x1)*(x3-x2)*(x3-x4)*(x3-x5)*(x3-x6);a4=(x-x1)*(x-x2)*(x-x3)*(x-x5)*(x-x6)/(x4-x1)*(x4-x2)*(x4-x3)*(x4-x5)*(x4-x6);a5=(x-x2)*(x-x3)*(x-x4)*(x-x1)*(x-x6)/(x5-x1)*(x5-x3)*(x5-x2)*(x5-x4)*(x5-x6);a6=(x-x2)*(x-x3)*(x-x4)*(x-x5)*(x-x1)/(x6-x1)*(x6-x2)*(x6-x3)*(x6-x4)*(x6-x5);实际值大约为:y=y1*a1+y2*a2+y3*a3+y4*a4+y5*a5+y6*a6;ifx=1910m=91772;估计值大约为:elsem=(91772-31872)/31872*y+y;估计值大约为:End用C+编写程序如下:#include#inClude#inClude#inCludedoubleH(doublex,doublea,doublep6)/求得插值基函数doubleh=1.0,f=1.0;for(inti=0;i6;i+)if(fabs(a-pi)0.000001)continue;h*=(x-pi);f*=(a-pi);/利用累乘求得插值基函数的分子部分/利用累乘求得插值基函数的分母部分returnh/f;doubleL(doublex,doublep6,doubleq6)/求得拉格朗日插值多项式代入x取值时的函数值doubleL=0;for(inti=0;i6;i+)if(fabs(x-pi)0.000001)returnpi;L+=qi*H(x,pi,p);/利用累加实现L=E(yi*n(x-xj)/(xi-xj)returnL;voidN(doubleq6,doublef65)doublel=1.0,h=0.0;for(inti=0;i6;i+)fi0=qi;for(i=1;i6;i+)for(intj=1;j6;j+)for(intk=0;k=j;k+)JdoubleLagrange(doublex,doublep6,doubleq6)returnL(x,p,q);voidmain()inti;doublex6,y6,l=1.0,h=1.0;doublef65;cout请输入x的取值:endl;for(i=0;ixi;cout请依次输入x对应的y的取值:endl;for(i=0;iyi;coutLagrange多插值项式:endl;coutL=刀(yi*n(x-xj)/(xi-xj),其中(i=0,l,2,3,4,5;j=0,l,2,3,4,5;j丰i)endl;coutendl;coutLagrange插值多项式在1910,1965,2002处的函数值:endl;cout当x值为1910时Lagrange(1910,x,y)endl;cout当x值为1965时Lagrange(1965,x,y)endl;cout当x值为2002时Lagrange(2002,x,y)endl;coutendl;2.用matlab编写的牛顿插值M文件如下:functiony=niuden5(x)y1=105711123203131669150697179323203212;x0=192019301940195019601970;fori=2:6y2(i)=(y1(1)-y1(i)/(x0(1)-x0(i);endfori=3:6y3(i)=(y2(2)-y2(i)/(x0(2)-x0(i);endfori=4:6y4(i)=(y3(3)-y3(i)/(x0(3)-x0(i);endfori=5:6y5(i)=(y4(4)-y4(i)/(x0(4)-x0(i);endy6(6)=(y5(5)-y5(6)/(x0(5)-x0(6);y=y1(1)+y2(2)*(x-x0(1)+y3(3)*(x-x0(1)*(x-x0(2)+y4(4)*(x-x0(1)*(x-x0(2)*(x-x0(3)+y5(5)*(x-x0(1)*(x-x0(2)*(x-x0(3)*(x-x0(4)+y6(6)*(x-x0(1)*(x-x0(2)*(x-x0(3)*(x-x0(4)*(x-x0(5);3.用matlab编写的自然样条函数M文件如下:function=yangtiaochazhi(x)y1=105711123203131669150697179323203212;x0=192019301940195019601970;fori=1:5h(i)=x0(i+1)-x0(i);endfori=1:4u(i)=h(i)/(h(i)+h(i+1);endu(5)=0;k(1)=0;fori=2:5k(i)=h(i)/(h(i-1)+h(i);endd(1)=0;d(6)=0;fori=2:3y21(i)=(y1(1)-y1(i)/(x0(1)-x0(i);endfori=3:4y22(i)=(y1(2)-y1(i)/(x0(2)-x0(i);endfori=4:5y23(i)=(y1(3)-y1(i)/(x0(3)-x0(i);endfori=5:6y24(i)=(y1(4)-y1(i)/(x0(4)-x0(i);endd(1)=0;d(6)=0;d(2)=(y21(2)-y21(3)/(x0(2)-x0(3);d(3)=(y22(3)-y22(4)/(x0(3)-x0(4);d(4)=(y23(4)-y23(5)/(x0(4)-x0(5);d(5)=(y24(5)-y24(6)/(x0(5)-x0(6);A=2k(1)0000;u(1)2k(2)000;0u(2)2k(3)00;00u(3)2k(4)0;000u(4)2k(5);0000u(5)2;B=d(1);d(2);d(3);d(4);d(5);d(6);M=;M=AB;echoifx=1930y=M(1)*(x0(2)-x)*(x0(2)-x)*(x0(2)-x)/(6*h(1)+M(2)*(x-x0(1)*(x-x0(1)*(x-x0(1)/(6*h(1)+(y1(1)-(M(1)*h(1)*h(1)/6)*(x0(2)-x)/h(1)+(y1(2)-(M(2)*h(1)*h(1)/6)*(x-x0(1)/h(1);elseifx=1940y=M(2)*(x0(3)-x)*(x0(3)-x)*(x0(3)-x)/(6*h(2)+M(3)*(x-x0(2)*(x-x0(2)*(x-x0(2)/(6*h(2)+(y1(2)-(M(2)*h(2)*h(2)/6)*(x0(3)-x)/h(2)+(y1(3)-(M(3)*h(2)*h(2)/6)*(x-x0(2)/h(2);elseifx=1950y=M(3)*(x0(4)-x)*(x0(4)-x)*(x0(4)-x)/(6*h(3)+M(4)*(x-x0(3)*(x-x0(3)*(x-x0(3)/(6*h(3)+(y1(3)-(M(3)*h(3)*h(3)/6)*(x0(4)-x)/h(3)+(y1(4)-(M(4)*h(3)*h(3)/6)*(x-x0(3)/h(3);elseifxm,y=cz5(1910)m,y=cz5(1965)m,y=cz5(2002)结果为:ans=实际值大约为:ans=估计值大约为:m=91772y=31872ans=实际值大约为:ans=估计值大约为:m=5.559574703016167e+005y=1.930815117187500e+005ans=实际值大约为:ans=估计值大约为:m=7.526371798548073e+004y=2.613874841600098e+004C+中的运行:请输入x的取值:192019301940195019601970请依次输入x对应的y的取值:105711123203131669150697179323203212Lagrange多插值项式:L=Y(yi*n(x-xj)/(xi-xj),其中(i=0,l,2,3,4,5;j=0,l,2,3,4,5;jHi)Lagrange插值多项式在1910,1965,2002处的函数值:当x值为1910时31872当x值为1965时193082当x值为2002时26138.72.牛顿插值在matlab命令窗口中输入如下代码:niuden5(1965),niuden5(2002)结果为:ans=1.930815117187500e+005ans=2.613874841600133e+0043. 样条插值在matlab命令窗口中输入如下代码:yangtiaochazhi(1965),yangtiaochazhi(2002)结果为:y=1.913745478468899e+005y=2.880973086315789e+005实验结果分析与小结1.5次拉格朗日插值与牛顿插值在估计人口时比较接近,但与真实值比起来误差较大,而用样条插值在区间内部估值比较准确,但在区间外估值误差相对较大哦。2.在matlab中数组名不能再用来作变量了哦。忽略此处.
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 活动策划


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!