拉格朗日插值实验报告.docx
- 文档编号:6731586
- 上传时间:2023-01-09
- 格式:DOCX
- 页数:12
- 大小:116.10KB
拉格朗日插值实验报告.docx
《拉格朗日插值实验报告.docx》由会员分享,可在线阅读,更多相关《拉格朗日插值实验报告.docx(12页珍藏版)》请在冰豆网上搜索。
拉格朗日插值实验报告
实验名称:
实验一拉格朗日插值
1引言
我们在生产生活中常常会遇到这样的问题:
某个实际问题中,函数f(x)在区间[a,b]上存在且连续,但却很难找到其表达式,只能通过实验和观测得到有限点上的函数表。
显然,根据这些点的函数值来求其它点的函数值是非常困难的。
有些情况虽然可以写出表达式,但构造复杂,使用不方便。
所以我们总是希望根据已有的数据点〔或函数表〕来构造某个简单函数P(x)作为f(x)的近似值。
插值法是解决此类问题的一种比较古老的、但却很常用的方法。
它不仅直接广泛地应用于生产实际和科学研究中,而且也是进一步学习数值计算方法的根底。
2实验目的和要求
运用Matlab编写三个.m文件,定义三种插值函数,要求一次性输入整函数表,并利用计算机选择在插值计算中所需的节点。
分别通过分段线性插值、分段二次插值和全区间上拉格朗日插值计算f(0.15),f(0.31),f(0.47)的近似值。
函数表如下:
x
0.0
0.1
0.195
0.3
0.401
0.5
f(x)
0.39894
0.39695
0.39142
0.38138
0.36812
0.35206
3算法原理与流程图
〔1〕原理
设函数y=在插值区间[a,b]上连续,且在n+1个不同的插值节点a≤x0,x1,…,xn≤b上分别取值y0,y1,…,yn。
目的是要在一个性质优良、便于计算的插值函数类Φ中,求一简单函数P(x),满足插值条件P(xi)=yi(i=0,1,…,n),而在其他点x≠xi上,作为f(x)近似值。
求插值函数P(x)的方法称为插值法。
在本实验中,采用拉格朗日插值法。
分段低次插值
当给定了n+1个点x0 这种分段低次插值叫分段线性插值,又称折线插值。 类似地,我们可以选取距离x最近的三个节点xi-1,xi与xi+1,然后进展二次插值,即得 这种分段低次插值叫分段二次插值,又称分段抛物线插值。 全区间上拉格朗日插值 对节点xi(i=0,1,…,n)中任一点xk(0≤k≤n),作一n次多项式lk(x),使它在该点上的取值为1,在其余点xi(i=0,1,…,k-1,k+1,…,n)上取值为零。 对应于每一节点xk(k=0,1,…,n),都能写出一个满足此条件的多项式,这样写出了n+1个多项式l0(x),l1(x),…,ln(x),其中 ; 由条件 可得 于是我们可以得出如下的拉格朗日n次插值多项式〔对于全区间上的插值,n取函数表的长度〕 (2)流程图 分段线性插值分段二次插值全区间拉格朗日插值 4程序代码及注释 1、分段线性插值 %分段线性插值 functiony=piece_linear(x0,y0,x) %x0,y0为点,x为待求点 n=length(x0);p=length(y0);m=length(x); %n,p,m分别为x0,y0,x长度 ifn~=p fprintf('Error! Pleaseinputagain! \n'); %x0和y0长度不等时,报错 else fori=1: m z=x(i); sum=0.0; l=0; %给l赋初值,根据x的值确定l ifz (1)|z>x0(n) fprintf('Error! x(%d)isoutofrange! \n',i); break; end %当插值点超出围时,报错 forj=2: n ifz l=j; end ifl~=0 break; end end %一旦l有非零值,那么终止循环,选出适宜的l fork=l-1: l a=1.0; fors=l-1: l ifs~=k a=a*(z-x0(s))/(x0(k)-x0(s)); end end sum=sum+y0(k)*a; end y(i)=sum; fprintf('y(%d)=%f\nx1=%.3fy1=%.5f,x2=%.3fy2=%.5f\n\n',i,y(i),x0(l-1),y0(l-1),x0(l),y0(l)); %输出插值结果和所需节点 end end end 2、分段二次插值 %分段二次插值 functiony=piece_square(x0,y0,x) %x0,y0为点,x为待求点 n=length(x0);p=length(y0);m=length(x); %n,p,m分别为x0,y0,x长度 ifn~=p fprintf('Error! Pleaseinputagain! \n'); %x0和y0长度不等时,报错 else fori=1: m z=x(i); sum=0.0; l=0; %给l赋初值,根据x的值确定l ifz (1)|z>x0(n) fprintf('Error! x(%d)isoutofrange! \n',i); break; end %当插值点超出围时,报错 forj=1: n-2 p=0.5*(x0(j)+x0(j+1)); ifz l=j; end ifl~=0 break; end %一旦l有非零值,那么终止循环,选出适宜的l end ifl==0 l=n-1; end %输入正确时,假设l还等于零,l=n-1 fork=l-1: l+1 a=1.0; fors=l-1: l+1 ifs~=k a=a*(z-x0(s))/(x0(k)-x0(s)); end end sum=sum+y0(k)*a; end y(i)=sum; fprintf('y(%d)=%f\nx1=%.3fy1=%.5f\nx2=%.3fy2=%.5f\nx3=%.3fy3=%.5f\n\n',i,y(i),x0(l-1),y0(l-1),x0(l),y0(l),x0(l+1),y0(l+1)); %输出插值结果与所需节点 end end end 3、拉格朗日全区间插值 %拉格朗日全区间插值 functiony=lagrange(x0,y0,x) %x0,y0为点,x为待求点 n=length(x0);p=length(y0);m=length(x); %n,p,m分别为x0,y0,x长度 ifn~=p fprintf('Error! Pleaseinputagain! \n'); %x0和y0长度不等时,报错 else fori=1: m z=x(i); s=0.0; ifz (1)|z>x0(n) fprintf('Error! x(%d)isoutofrange! \n',i); break; end %当插值点超出围时,报错 fork=1: n p=1.0; forj=1: n ifj~=k p=p*(z-x0(j))/(x0(k)-x0(j)); end end s=p*y0(k)+s; end y(i)=s; fprintf('y(%d)=%.5f\n',i,y(i)); %输出插值结果 end end end 5算例分析 1、测试例如 >>x=[1234]; >>y=[234]; >>y2=lagrange(x,y,x0) Error! Pleaseinputagain! >>x=[1234]; >>y=[2345]; >>x0=[0.55.5]; >>y2=lagrange(x,y,x0) Error! x (1)isoutofrange! >>x=[1234]; >>y=[2345]; >>x0=[1.55.5]; >>y2=lagrange(x,y,x0) y (1)=2.50000 Error! x (2)isoutofrange! y2= 2.500000000000000 2、首先输入函数变及待求点 >>x=[0.00.10.1950.30.4010.5]; >>y=[0.398940.396950.391420.381380.368120.35206]; >>x0=[0.150.310.47]; 注: 保证在matlab工作目录中有三个.m文件 3、分段线性插值 y0=piece_linear(x,y,x0) y (1)=0.394039 x1=0.100y1=0.39695,x2=0.195y2=0.39142 y (2)=0.380067 x1=0.300y1=0.38138,x2=0.401y2=0.36812 y(3)=0.356927 x1=0.401y1=0.36812,x2=0.500y2=0.35206 y0= 0.3940394736842110.3800671287128710.356926666666667 4、分段二次插值 >>y1=piece_square(x,y,x0) y (1)=0.394460 x1=0.100y1=0.39695 x2=0.195y2=0.39142 x3=0.300y3=0.38138 y (2)=0.380225 x1=0.195y1=0.39142 x2=0.300y2=0.38138 x3=0.401y3=0.36812 y(3)=0.357247 x1=0.300y1=0.38138 x2=0.401y2=0.36812 x3=0.500y3=0.35206 y1= 0.3944603195488720.3802246915953730.357246844884488 5、全区间拉格朗日插值 >>y2=lagrange(x,y,x0) y (1)=0.39447 y (2)=0.38022 y(3)=0.35722 y2= 0.3944728038780610.3802190624547320.357222112339485 6讨论与结论 1、使用tic,toc函数计算以下四种方法计算上述问题所运行的时间 Function lagrange(x0,y0,x) piece_linear(x0,y0,x) piece_square(x0,y0,x) 运行时间(s) 0.000272 0.000375 0.000272 从三次实验结果可知,三个程序的运行时间都很短。 2、程序优化 由分段线性插值和分段二次插值的原理,x取值在函数表围时,插值结果有意义,而当x取值在函数表围以外,利用分段线性插值公式仍可以进展运算并得到一个值,但其结果不准确;分段二次插值那么无法找到三个适宜的点以求插值,不予以输出结果;假设输入的函数表x与y的长度不相等,那么无法插值。 所以参加以下判断以提高插值的准确性 n=length(x0);p=length(y0);m=length(x); ifn~=p fprintf('Error! Pleaseinputagain! \n'); ifz (1)|z>x0(n) fprintf('Error! x(%d)isoutofrange! \n',i); break; end 3、作图比较 上图为三种方法的插值曲线,其中x取0到0.5,步长为0.001,由图可得,三种曲线非常接近,这说明我们用拉格朗日插值计算所给点函数值的近似值时,引起的误差还是比较小的。 参考文献 [1]易大义,云宝,有法.计算方法(第2版),大学.p.29-53. [2]琨高思超毕靖编著MATLAB2021从入门到精通电子工业
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 拉格朗日插值 实验 报告
![提示](https://static.bdocx.com/images/bang_tan.gif)