第5章 实验四Lagrange插值多项式
实验目的:理解Lagrange插值多项式的基本概念,熟悉Lagrange插值多项
式的公式及源代码,并能根据所给条件求出Lagrange插值多项式,理解龙格现象。
5.1 Lagrange插值多项式 Lagrange插值多项式的表达式: L(x)??yili(x),i?1n?1li(x)??j?1j?in?1(x?xj)(xi?xj),i?1,2,?,n?1。
其中li(x)被称为插值基函数,实际上是一个n次多项式。li(x)的这种表示具有较好的对称性。公式具有两大优点:(1)求插值多项式,不需要求解线性方程组,当已知数据点较多时,此公式更能显示出优越性。(2)函数值可以用符号形式表示,数据点未确定的纵坐标可用多项式表示。
5.2 Lagrange插值多项式源代码I
% 功能: 对一组数据做Lagrange插值 % 调用格式:yi=Lagran_(x,y,xi) % x,y 数组形式的数据表 % xi:待计算y值的横坐标数组 % yi用Lagrange 插值算出的y值数组 function fi=Lagran_(x,f,xi)
fi=zeros(size(xi)); np1=length(f); for i=1:np1
z=ones(size(xi)); for j=1:np1
if i~=j,z=z.*(xi-x(j))/(x(i)-x(j));end end
fi=fi+z*f(i); end return
例5.1 已知4对数据(1.6,3.3),(2.7,1.22),(3.9,5.61),(5.6,2.94)。写出这4个数据点的Lagrange插值公式,并计算出横坐标xi=[2.101,4.234]时对应的纵坐标。
解:4个数据点的Lagrange插值公式为:
L3(x)?3.3*
(x?2.7)*(x?3.9)*(x?5.6)?(1.6?2.7)*(1.6?3.9)*(1.6?5.6)(x?1.6)*(x?3.9)*(x?5.6)4.22*?(2.7?1.6)*(2.7?3.9)*(2.7?5.6)
(x?1.6)*(x?2.7)*(x?5.6)3.9*?(3.9?1.6)*(3.9?2.7)*(3.9?5.6)(x?1.6)(x?2.7)*(x?3.9)2.94*(5.6?1.6)*(5.6?2.7)*(1.6?3.9)清单5.1 clear
x=[1.6, 2.7, 3.9, 5.6]; y=[3.3, 1.22, 5.61, 2.94]; xi=[2.101,4.234]; yi=Lagran_(x,y,xi); xx=1.5:0.05:6.5; yy=Lagran_(x,y,xx); plot(xx,yy,x,y,'o')
其结果为:
yi =
1.0596 6.6457
1086g(x):-, data points:o420-2-41234x567
图5.1 插值多项式曲线图
5.3 Lagrange插值多项式源代码II
% 输入:x是插值节点横坐标向量;y是插值节点对应纵坐标向量。
% 输出:C是拉格朗日插值多项式的系数矩阵;L是插值基函数系数矩阵。
function [C,L]=lagran(x,y) w=length(x); n=w-1; L=zeros(w,w); for k=1:n+1
V=1; for j=1:n+1 if k~=j
V=conv(V,poly(x(j)))/(x(k)-x(j)); end end L(k,:)=V; end C=y*L
程序中使用了命令poly和conv。poly命令创建一个向量,其项为以多项式的系数,该多项式具有给定的根。conv命令生成一个向量,其项为多项式系数,该多项式是另外两个多项式的乘积。例如:找出两个一次多项式p(x)和q(x)的乘积,它们的根为3和5。
>> p=poly(3) p=
1
-3
>> q=poly(5) q=
1
>> conv(p,q) ans=
1 -8 15
-5
例5.2 用Lagrange插值多项式源代码II,对4对数据(1.6,3.3),
(2.7,4.22),(3.9,5.61),(5.6,2.94),写出这4个数据点的Lagrange插值公式,并计算出横坐标组xi=[2.101,4.234]时对
应的纵坐标值。
解:4个数据点的Lagrange插值公式为:
L3(x)?3.3*(x?2.7)*(x?3.9)*(x?5.6)?(1.6?2.7)*(1.6?3.9)*(1.6?5.6)(x?1.6)*(x?3.9)*(x?5.6)4.22*?(2.7?1.6)*(2.7?3.9)*(2.7?5.6)
(x?1.6)*(x?2.7)*(x?5.6)3.9*?(3.9?1.6)*(3.9?2.7)*(3.9?5.6)(x?1.6)(x?2.7)*(x?3.9)2.94*(5.6?1.6)*(5.6?2.7)*(1.6?3.9)清单5.2 clear
x=[1.6, 2.7, 3.9, 5.6]; y=[3.3, 1.22, 5.61, 2.94]; xi=[2.101,4.234]; [C,L]=lagran(x,y); xx=1.5:0.05:6.5; yy= polyval(C,xx); plot(xx,yy, x,y,'o')
数据清单见图5.2,插值曲线图见图5.3。
图5.2 输出插值多项式的系数、插值基函数系数矩阵及yy值
1050-5-10-151.522.533.544.555.566.5
图5.3 插值多项式曲线图形
例5.3 将区间[-5,5]等分5份、10份,求函数y?1多项式,作出函数y?1解:
清单5.3 clear,clf x=-5:2:5; y=1./(1+x.^2); [C,L]=lagran(x,y); xx=-5:0.1:5; yy=polyval(C,xx); hold on
plot(xx,yy,'b',x,y,'.') xp=-5:0.01:5; z=1./(1+xp.^2); plot(xp,z,'r')
清单5.4
(1?x2)的拉格朗日插值
(1?x2)的原图像,观察龙格现象得出什么结果?
clear,clf x=-5:1:5; y=1./(1+x.^2); [C,L]=lagran(x,y); xx=-5:0.1:5; yy=polyval(C,xx); hold on
plot(xx,yy,'b',x,y,'.') xp=-5:0.01:5; z=1./(1+xp.^2); plot(xp,z,'r')
1.2data1data2data3z=1./(1+xp.2)0.810.66个点的插值多项式0.40.20-0.2-5-4-3-2-1012345
图5.4 5等份插值图形
2data1data2data31.510.50-0.5-5-4-3-2-1012345
图5.5 10等份插值图形
通过观察图形可以得出:
(1) 并不是插值节点越多,插值多项式逼近函数效果就越好。 (2) 误差较大地方,是在插值区间两端点附近出现。 练习题
1.设f(x)?x?2/x,(1)用基于点x0?1,x1?2和x2?2.5的二次拉格朗日
多项式,求f(1.5)和f(1.2)的近似值。(2)用基于点x0?0.5,x1?1,
x2?3和x3?5的三次拉格朗日多项式,求f(1.5)和f(1.2)的近似值。
2.用等距插值节点计算区间0?x??/2上函数xsinx的四次拉格朗日多项
式。每隔?/16计算一次插值误差,并画出图形。