发布时间 : 星期六 文章常见插值法更新完毕开始阅读e3184362cfc789eb172dc864
常见插值法
【摘 要】插值方法在数值分析中起着非常重要的作用。在此介绍一些常见的插值方法及 其应用范例。
【关键字】数值分析;插值方法;应用;
1. 插值法定义
插值法又称“内插法”,是利用函数f (x)在某区间中
插入若干点的函数值,作出适当的特定函数,在这些
x0 x1 x2 ....... xn-1 xn y0 y1 y2 ....... yn-1 yn
表(1) 插值点
点上取已知值,在区间的其他点上用这特定函数的值作为函数f (x)的近似值,这种方法称为插值法。如果这特定函数是多项式,就称它为插值多项式。
2.常见的插值法及其构造
? Lagrange插值法
(a).公式推导:
表(1)的Lagrange插值的插值多项式
n
Ln(x)??f(xi)li(x),(j=0,1,2....n)。
i?0其中插值基函数是 lxj)n(x)??n(x?,(i,j=0,1 2...n) 。 i(xi??0ji?xj)其插值余项为
R(x)?f(x)?Ln(x)?f(n?1)n(?)?n?1(x),
(n?1)!
n 其中??(a,b),?n?1(x)??(x?xj)(x?x) ii??0jij
(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).方法缺陷:当插值点个数n?7时,将产生
龙格现象:
经典例子,对f(x)?1(1?25x2)进行拉格朗日插值图(1)中从左到右,从上到下,n分别为
图(1) Lagarange插值法的龙格现象
4,5...11,可以看出,当n?7后,它的\\插值函数在
两个端点处发生剧烈的波动,造成较大的误差。所以拉格朗日插值法一般不适用于高次插值。
? 分段线性插值法
(a).插值原理:
为避免高次产生的龙格现象,采用分段插值,相邻两节点间的函数为一次线性函数, 图形为线段,在[a,b]间为折线,如图(2)。
x1x2xn?1
a?x0xn?b
图(2) 分段线性插值
(b).matlab实现方法:
Matlab中没有现成的函数,现编译如下: function 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插值引入插
值点的
导数。
xx0x1?xn
f(x)y0y1?ynf?(x)y?
0y1??y?n
表(2) Hermite插值法 由于若
f(x)?C1[a,b]且已知f(x)函数表及导
数表,则存在唯一不超过2n?1次多项式H2n?1(x)满足插值条件
??H2n?1(xi)?yiH(x'
(i?0,1,....n),
?2n?1i)?yi则,通过求解方程,可得出插值函数
其插值余项为 Rf(2n?2)(?)2n?1(x)?(2n?2)!?2n?1(x)??(a,b)且与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 = 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
lagarange 龙格 插值法现象 降次 分 段 线 节点 性防止龙格现象 插值法 不光滑 光滑 Hermite 导数不 节点处导数相同插值法 易得到 由 边界条件推导各节点导数 三次样条 插值法 3. 插值法对比例证
对y?1,x?[-1,1],在1?25x2x=-1,-0.5,0,0.5,1点处插值 代码如下:
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');
(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.”
⑤ 插值法关系图
结果图形为
(注:蓝色实线为原函数,蓝色圆点为插值点,蓝色短虚线为分段线性插值,蓝色点虚线为Hermite插值,绿色点 虚线为Lagarange插值,绿色短虚线为三次样条插值)
结果分析:
所有插值法中,分段线性插值最贴近原函数,其次Hermite插值法,再其次为三次样条,与Lagarange插值
法接近。但分段线性插值法在结点处不光滑,Hermite导数信息不易获得,Lagarange插值法虽然计算简单,但高次产生龙格现象,所以三次样条插值法比较实用。
【参考文献】1.MATLAB数值分析 第2版 机械工业出版社 张德丰 等编著