拉格朗日插值实验报告.docx

上传人:b****6 文档编号:4393656 上传时间:2022-12-01 格式:DOCX 页数:12 大小:115.86KB
下载 相关 举报
拉格朗日插值实验报告.docx_第1页
第1页 / 共12页
拉格朗日插值实验报告.docx_第2页
第2页 / 共12页
拉格朗日插值实验报告.docx_第3页
第3页 / 共12页
拉格朗日插值实验报告.docx_第4页
第4页 / 共12页
拉格朗日插值实验报告.docx_第5页
第5页 / 共12页
点击查看更多>>
下载资源
资源描述

拉格朗日插值实验报告.docx

《拉格朗日插值实验报告.docx》由会员分享,可在线阅读,更多相关《拉格朗日插值实验报告.docx(12页珍藏版)》请在冰豆网上搜索。

拉格朗日插值实验报告.docx

拉格朗日插值实验报告

实验名称:

实验一拉格朗日插值

1引言

我们在生产生活中常常会遇到这样的问题:

某个实际问题中,函数f(x)在区间[a,b]上存在且连续,但却很难找到其表达式,只能通过实验和观测得到有限点上的函数表。

显然,根据这些点的函数值来求其它点的函数值是非常困难的。

有些情况虽然可以写出表达式,但结构复杂,使用不方便。

所以我们总是希望根据已有的数据点(或函数表)来构造某个简单函数P(x)作为f(x)的近似值。

插值法是解决此类问题的一种比较古老的、但却很常用的方法。

它不仅直接广泛地应用于生产实际和科学研究中,而且也是进一步学习数值计算方法的基础。

2实验目的和要求

运用Matlab编写三个.m文件,定义三种插值函数,要求一次性输入整张函数表,并利用计算机选择在插值计算中所需的节点。

分别通过分段线性插值、分段二次插值和全区间上拉格朗日插值计算f,f,f的近似值。

已知函数表如下:

x

f(x)

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=;

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=;

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=;

l=0;

%给l赋初值,根据x的值确定l

ifz

(1)|z>x0(n)

fprintf('Error!

x(%d)isoutofrange!

\n',i);

break;

end

%当插值点超出范围时,报错

forj=1:

n-2

p=*(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=;

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=;

ifz

(1)|z>x0(n)

fprintf('Error!

x(%d)isoutofrange!

\n',i);

break;

end

%当插值点超出范围时,报错

fork=1:

n

p=;

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=[];

>>y2=lagrange(x,y,x0)

Error!

x

(1)isoutofrange!

>>x=[1234];

>>y=[2345];

>>x0=[];

>>y2=lagrange(x,y,x0)

y

(1)=

Error!

x

(2)isoutofrange!

y2=

2、首先输入函数变及待求点

>>x=[];

>>y=[];

>>x0=[];

注:

保证在matlab工作目录中有三个.m文件

3、分段线性插值

y0=piece_linear(x,y,x0)

y

(1)=

x1=y1=,x2=y2=

y

(2)=

x1=y1=,x2=y2=

y(3)=

x1=y1=,x2=y2=

 

y0=

4、分段二次插值

>>y1=piece_square(x,y,x0)

y

(1)=

x1=y1=

x2=y2=

x3=y3=

y

(2)=

x1=y1=

x2=y2=

x3=y3=

y(3)=

x1=y1=

x2=y2=

x3=y3=

 

y1=

5、全区间拉格朗日插值

>>y2=lagrange(x,y,x0)

y

(1)=

y

(2)=

y(3)=

y2=

6讨论与结论

1、使用tic,toc函数计算下列四种方法计算上述问题所运行的时间

Function

lagrange(x0,y0,x)

piece_linear(x0,y0,x)

piece_square(x0,y0,x)

运行时间(s)

从三次实验结果可知,三个程序的运行时间都很短。

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到,步长为,由图可得,三种曲线非常接近,这说明我们用拉格朗日插值计算所给点函数值的近似值时,引起的误差还是比较小的。

 

参考文献

[1]易大义,沈云宝,李有法.计算方法(第2版),浙江大学出版社..

[2]张琨高思超毕靖编着MATLAB2010从入门到精通电子工业出版社

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 求职职场 > 社交礼仪

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1