拉格朗日插值实验报告.docx
《拉格朗日插值实验报告.docx》由会员分享,可在线阅读,更多相关《拉格朗日插值实验报告.docx(10页珍藏版)》请在冰豆网上搜索。
拉格朗日插值实验报告
实验名称:
实验一拉格朗H插值
1引言
我们在生产生活中常常会遇到这样的问题:
某个实际问题中,函数f(x)在区间[a,b]上存在且连续,但却很难找到其表达式,只能通过实验和观测得到有限点上的函数表。
显然,根据这些点的函数值来求其它点的函数值是非常困难的。
有些情况虽然可以写出表达式,但结构复杂,使用不方便。
所以我们总是希望根据已有的数据点(或函数表)来构造某个简单函数Hx)作为f(x)的近似值。
插值法是解决此类问题的一种比较古老的、但却很常用的方法。
它不仅直接广泛地应用于生产实际和科学研究中,而且也是进一步学习数值计算方法的基础。
2实验目的和要求
运用Matlab编写三个.m文件,定义三种插值函数,要求一次性输入整张函数表,并利用计算机选择在插值计算中所需的节点。
分别通过分段线性插值、分段二次插值和全区间上拉格朗日插值计算f,于的近似值。
己知函数表如下:
X
f(x)
3算法原理与流程图
(1)原理
设函数y二在插值区间[a,b]上连续,且在n+1个不同的插值节点aWxo,x“…,x.Wb上分别取值%,九…,%。
目的是要在一个性质优良、便于计算的插值函数类①中,求一简单函数尸(x),满足插值条件P(Xi)=yi(i=O,l,-,n),而在其他点xHxi上,作为巩Q近似值。
求插值函数尸(x)的方法称为插值法。
在本实验中,采用拉格朗日插值法。
①分段低次插值
当给定了n+]个点xoyn后,若要计算xHx’处函数值f(x)的近似值,可先选取两个节点Xt与X’使x£[XiXi],然后在小区间[Xi-x,Xi]
上作线性插值,即得
fW-(A)=畑上工+Z
-Vi
这种分段低次插值叫分段线性插值,乂称折线插值。
类似地,我们可以选取距离X最近的三个节点E,X’与畑,然后进行二次插值,即得
f(x)^P2(x)=
(+1
E
&■一:
X-Xj
/+1(
儿口
jwk
这种分段低次插值叫分段二次插值,乂称分段抛物线插值。
②全区间上拉格朗□插值
对节点Xi(i=O,1,•••>n)中任一点Xk(OWkWn),作一n次多项式lk(x),使它在该点上的取值为1,在其余点x,(i=O,l,・・・,k-l,k+l,・・・,n)上取值为零。
对应于每一节点禺(k二0,1,…,n),都能写出一个满足此条件的多项式,这样写出了n+1个多项式lo(x),11(X),•••,ln(x),其中
£(x)=&(x_X。
)(JT一耳)…(X-Xk_1)(X-耳+1)…•(X_心);由条件厶(孔)=1可得
"(卩-%)…(卩-心(玉-艰)…(丑-X)
于是我们可以得出如下的拉格朗日n次插值多项式(对于全区间上的插值,n取函数表的长度)
乙3=儿厶(%)+yjQ)+…y丄3)
(2)流程图
分段线性插值
分段二次插值
p-p*(x-Xo(i)y(Xn(k}-Wi))
S=S+y°(k"
全区间拉格朗口插值
4程序代码及注释
1、分段线性插值
%分段线性插值
functiony=piece_linear(xO,yO,x)
%xO,yO为已知点,x为待求点
n二length(xO);p=length(yO);m=length(x);
%n,p,m分别为xO,yO,x长度
ifn、二p
fprintf(Error!
Pleaseinputagain!
\n);
%xO和yO长度不等时,报错
else
for1=1:
m
z=x(i);
sum二;
1=0;
%给1赋初值,根据X的值确定1
ifz(1)z>x0(n)
fprintf('Error!
x(%d)isoutofrange!
\n,,i);break;
end
%当插值点超出范围时,报错
forj二2:
n
ifz1=J;
end
辻广二0
break;
end
end
%—旦1有非零值,则终止循环,选出合适的1
fork=l-l:
l
a二;
fors二1-1:
1
辻s'k
a二a*(z-xO(s))/(xO(k)-xO(s));
end
sum二sum+yO(k)*a;
end
y(i)二sum;
fprintfCy(%d)=%f\nxl=%.3fyl=%.5f,x2=%.3fy2=%.5f\n\n,,i,y(i),xO(1~1),yO(1~1),xO
(1),yO
(1));
%输出插值结果和所需节点
end
end
end
2、分段二次插值
%分段二次插值
functiony二piece_square(xO,yO,x)
%xO,yO为已知点,x为待求点
n=length(xO);p=length(yO);m=length(x);
%n,p,m分别为xO,yO,x长度
ifn、二p
fprintf(Error!
Pleaseinputagain!
\n);
%xO和yO长度不等时,报错
else
fori二l:
m
z=x(i);
sum二;
1=0;
%给1赋初值,根据X的值确定1
ifz(1)z>x0(n)
fprintfCError!
x(%d)isoutofrange!
Xn^,i);break;
end
%当插值点超出范围时,报错
forj二l:
n-2
p=*(x0(j)+x0(j+l));
ifz
1=J;
end
辻广二0
break;
end
%—旦1有非零值,则终止循环,选出合适的1
end
if1==0
l=n-l;
end
%输入正确时,若1还等于零,1二n-l
fork=l-l:
l+l
a二;
fors二IT:
1+1
辻s"=k
a二a*(z-xO(s))/(xO(k)~x0(s));
end
end
sum二sum+yO(k)*a;
end
y(i)二sum;
fprintf(?
y(%d)=%f\nxl=%.3fyl=%.5f\nx2=%.3fy2=%.5f\nx3=%.3fy3=%.5f\n\n,,i,y(i),xO(1~1),yO(1~1),xO
(1),yO
(1),xO(1+1),yO(1+1));%输出插值结果与所需节点endendend
3、拉格朗ri全区间插值
%拉格朗ri全区间插值
functiony=lagrange(xO,yO,x)
%xO,yO为已知点,x为待求点
n=length(xO):
p=length(yO);m=length(x);
%n,p,m分别为xO,yO,x长度
ifn、二p
fprintf(Error!
Pleaseinputagain!
\n);
%x0和yO长度不等时,报错
else
fori二l:
m
z=x(i);
S二;
ifz(1)z>xO(n)
fprintf('Error!
x(%d)isoutofrange!
\n,i);break;
end
%当插值点超出范围时,报错
fork=l:
n
P二;
forj=l:
n
p二p*(z-xO(j))/(xO(k)-xO(j));
if
end
s二p*yO(k)+s;
end
y(i)=s;
fprintf(y(%d)=%.5f\n‘,i,y(i));
%输出插值结果
end
end
end
5算例分析
1、测试示例
»x=[l234];
»y二[234];
>>y2z:
lagrange(x,y,xO)
Error!
Pleaseinputagain!
»x=[l234];
»y=[2345];
»x0=[];
>>y2=lagrange(x,y,xO)
Error!
x(l)isoutofrange!
»X二[1234];
»y二[2345];
»xO=[];
>>y2z:
lagrange(x,y,xO)
y(l)=
Error!
x
(2)isoutofrange!
y2二
2、
首先输入函数变及待求点
»
x=[];
»
y=[];
»
x0=[];
注:
保证在matlab工作目录中有三个.m文件
3、
分段线性插值
yO二piece_linear(x,y,xO)y(l)=
xl二yl二,x2二y2二
y
(2)=
xl二yl二,x2二y2二
y(3)=
xl二yl二,x2二
y2=
yO二
4、分段二次插值
>>yl=piece_square(x,y,xO)y(l)=
xl二yl二
x2=y2=
x3二y3二
y
(2)=
xl二yl二
x2=y2=
x3二y3二
y(3)=
xl二yl二
x2=y2=
x3二y3二
yl二
5、全区间拉格朗口插值>>y2=lagrange(x,y,xO)y(l)=
y
(2)=
y(3)=
y2=
6讨论与结论
1、使用tic,toe函数计算下列四种方法计算上述问题所运行的时间
Function
lagrange(xO,yO
X)
piece_linear(x
0,yO,x)
piece_square(x
0,yO,x)
运行时间(s)
从三次实验结果可知,三个程序的运行时间都很短。
2、程序优化
由分段线性插值和分段二次插值的原理,x取值在函数表范围内时,插值结果有意义,而当x取值在函数表范围以外,利用分段线性插值公式仍可以进行运算并得到一个值,但其结果不准确;分段二次插值则无法找到三个合适的点以求插值,不予以输出结果;若输入的函数表x与y的长度不相等,则无法插值。
所以加入以下判断以提高插值的准确性
n^length(xO);p=length(yO);m二length(x);
ifn〜二p
fprintf(Error!
Pleaseinputagain!
\n):
ifz(1)|z>xO(n)
fprintf(Error!
x(%d)isoutofrange!
\n,i);
break;
end
3、作图比较
上图为三种方法的插值曲线,其中X取0到,步长为,由图可得,三种曲线非常接近,这说明我们用拉格朗日插值计算所给点函数值的近似值时,引起的误差还是比较小的。
参考文献
[1]易大义,沈云宝,李有法.计算方法(第2版),浙江大学出版社..
[2]张琨高思超毕靖编着MATLAB2010从入门到精通电子工业出版社