当前位置:文档之家› 常见插值法

常见插值法

常见插值法
【摘 要】插值方法在数值分析中起着非常重要的作用。

在此介绍一些常见的插值方法及 其应用范例。

【关键字】数值分析;插值方法;应用;
1. 插值法定义
插值法又称“内插法”,是利用函数f (x)在某区间中
插入若干点的函数值,作出适当的特定函数,在这些
表(1) 插值点
点上取已知值,在区间的其他点上用这特定函数的值作为函数f (x)的近似值,这种方法称为插值法。

如果这特定函数是多项式,就称它为插值多项式。

2.常见的插值法及其构造
Lagrange 插值法
(a).公式推导:
表(1)的Lagrange 插值的插值多项式
∑==n
i i i x l x f x 0
n )()()(L ,(j=0,1,2....n)。

其中插值基函数是

≠=--=n
j
i i j i j x x x x x l 0
n )
()()(,(i,j=0,1 2...n) 。

其插值余项为
其中),b a (∈
ξ,∏≠=+--=n
j
i i j
i
j x x x x x 0
1n )()
()(ω
(b).matlab 实现方法:
Matlab 没有直接求解的相关函数,现编译如下: function yi = Lagarange_chazhi(x,y,xi)
% 求拉格朗日插值,并返回一个输入为xi 时的函数值 % x 为插值点向量,至少有三项 % y 为插值点值的向量,项数与x 相同 m = length(x); %求插值个数 m1 = length(y); if m<=2
error('项数不足!'); end if m~=m1
error('y 的项数应与x 相同'); end %对参数的判断 lag_hanshu = 0; syms X ;
for (l = 1:m) %构造插值基函数 la = y(l); for a = (1:l-1)
la = la*(X-x(a))/(x(l)-x(a)); end
for a = (l+1:m)
la = la*(X-x(a))/(x(l)-x(a)); end
format long
lag_hanshu = lag_hanshu+la;
%求解出插值函数 end
yi = subs( lag_hanshu,'X',xi);
%返回插值函数输入为xi 时的值 End
(c).方法缺陷:当插值点个数7n ≥时,将产生
龙格现象:
经典例子,对)
251(1
)(2x x f +=
进行拉格朗日插
0x 1x 2x ....... 1-n x n x 0y 1y 2y ....... 1-n y n y
),
(!)1()
()()()(1)1(x n f x L x f x R n n n n +++=-=ωξ
x a =b
x n =1x 2x 1
-n x 值图(1)中从左到右,从上到下,n 分别为
图(1) Lagarange 插值法的龙格现象
4,5...11,可以看出,当7n
≥后,它的\插值函数在
两个端点处发生剧烈的波动,造成较大的误差。

所以拉格朗日插值法一般不适用于高次插值。

分段线性插值法
(a).插值原理:
为避免高次产生的龙格现象,采用分段插值,相邻两节点间的函数为一次线性函数, 图形为线段,在[a,b]间为折线,如图(2)。

图(2) 分段线性插值
(b).matlab 实现方法:
Matlab 中没有现成的函数,现编译如下: f unction Fenduan_liner(x,y) %对x,y 进行分段线性插值 %用虚线画出插值后的函数
m = length(x); %求插值个数 m1 = length(y); if m~=m1
error('y 的项数应与x 相同');
end %对参数的判断 hold on ; for ii = 1:m-1
plot([x(ii) x(ii+1)],[y(ii) y(ii+1)]); %画出线段 end
plot(x,y,'o'); %画出插值点 end
(c).方法缺陷:在节点处曲线不平滑。

保形插值(Hermite 插值) (a).插值原理:
针对分段插值法不光滑的问题,Hermite 插值引入插
值点的
导数。

表(2) Hermite 插值法 由于若
],[)(1b a C x f ∈且已知)(x f 函数表及导
数表,则存在唯一不超过12+n 次多项式)(12x H n +满足插值条件

⎨⎧==++'1212)()(i y x H y x H i n i
i n
),....,1,0(n i =
则,通过求解方程,可得出插值函数
其插值余项为 ),(b a ∈ξ且与x 有关。

(b).matlab 实现方法:
Matlab 中没有现成的函数,现编译如下: function yi = Hermite(x,y,der_y,xi)
%对x,y 进行Hermite 插值,其各节点的导数为der_y %返回值为带入矩阵xi 后的函数值 if length(x) == length(y)
if length(y) == length(der_y)
n
n
n y y y x f y y y x f x x x x ''''
1
1
010)
()
()()!
22()(2
1)22(x n f n n +++=
ωξ)(12x R n +
n = length(x); %求插值个数end
else
error('y的项数应与x相同');
end
if n<=1
warning('项数不足!');
end%对参数的判断syms X;
H = 0;
for jj = 1:n
a = 0;
b = 0;
l = 1;
for ii = 1:n
if ii ~= jj
a = a+1/(x(jj)-x(ii));
l = l*(X-x(ii))/(x(jj)-x(ii));
end
end
A = (1-2*(X-x(jj))*a)*l^2;
B = (X-x(jj))*l^2;
H = H+(A*y(jj)+B*der_y(jj)); %迭代法求H
end
yi = subs(H,'X',xi);
end
(c).方法缺陷:无法获得各点的导数
④三次样条法
(a).插值原理:
对每两个点间进行三次多项式的插值,且通过端点导数推导出各点导数,使得插值函数在插值点处导数相等。

(b).matlab实现方法:
Matlab有现成的函数spline,以下为‘help spline’
“PP = spline(X,Y) provides the piecewise polynomial form of the cubic spline interpolant to the data values Y at the data sites X,for use with the evaluator PPVAL and the spline utility UNMKPP.X must be a vector.”
⑤插值法关系图
3.插值法对比例证
代码如下:
syms X;
Y = 1./(1+25*X^2);
x = -1:0.5:1;
y = subs(Y,'X',x);
der_y = subs(diff(Y),'X',x);
xi = -1:0.01:1;
yi = 1./(1+25*xi.^2);
yi_Lagarange = Lagarange_chazhi(x,y,xi); yi_Hermite = Hermite(x,y,der_y,xi);
yi_Yangtiao = spline(x,y,xi);
hold on;
plot(x,y,'o',xi,yi,'b');
%画出分段插值
Fenduan_liner(x,y);
%画出拉格朗日插值
plot(xi,yi_Lagarange,':g');
%画出Hermite插值
plot(xi,yi_Hermite,':');
%画出三次样条插值
plot(xi,yi_Yangtiao,'--g');
结果图形为
(注:蓝色实线为原函数,蓝色圆点为插值点,蓝色短虚线为分段线性插值,蓝色点虚线为Hermite插值,绿色点虚线为Lagarange插值,绿色短虚线为三次样条插值)
结果分析:
所有插值法中,分段线性插值最贴近原函数,其次Hermite插值法,再其次为三次样条,与Lagarange插值法接近。

但分段线性插值法在结点处不光滑,Hermite导数信息不易获得,Lagarange插值法虽然计算简单,但高次产生龙格现象,所以三次样条插值法比较实用。

【参考文献】1.MATLAB数值分析第2版机械工业出版社张德丰等编著。

相关主题