常见插值法 联系客服

发布时间 : 星期二 文章常见插值法更新完毕开始阅读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版 机械工业出版社 张德丰 等编著