Matlab 数值计算之函数插值

微积分中对于连续或可导函数的研究虽有各路方法各显神通,但对于一个实际问题,若仅给出离散的数据点,通常首先要做的工作是根据这些离散点拟合出便于研究的连续函数。这类问题通常称作「数据拟合」,而其中的特殊情形便是函数插值。

多项式拟合插值中最「直接」的算法,就是对于 n+1 个给定的数据点对 (xi,yi),i=0,1,,n,假设 n 次多项式 pn(x)=i=0naixi 过所有的数据点,即 pn(xi)=yi,即:

(1x01x02x0n1x0n1x11x12x1n1x1n1x21x22x2n1x2n1xn11xn12xn1n1xn1n1xn1xn2xnn1xnn)V(a0x0n1a1x1n1a2x2n1an1xn1n1anxnn1)a=(y0x0n1y1x1n1y2x2n1yn1xn1n1ynxnn1)y

显然 V 为 Vandermonde 矩阵。关于 Vandermonde 行列式的计算,这里列出两种计算方法。

Vandermonde 行列式计算方法

但是解这个线性方程组是很不明智的,如果数据点较近,V 会接近奇异矩阵。而拉格朗日插值法则不需要硬着头皮解方程。

拉格朗日插值

n 次 Lagrange 插值多项式系数 l0(x),l1(x),,ln(x) 定义为 li(xj)={1,i=j0,ij,则多项式可表示为

P(x)=y0l0(x)+y1l1(x)++ynln(x)=i=0nyili(x)

注意这里的每个 li(x) 均为 n 次多项式,且由定义可知 li(x)n 个根

x0,x1,x2,,xi1,xi+1,,xn

所以 li(x) 可表示成 li(x)=Ciji(xxj),进一步由 li(x) 定义,

1=li(xi)=Ciji(xixj)  Ci=1ji(xixj)  li(x)=ji(xxj)ji(xixj)

所以 Lagrange 插值多项式为

p(x)=i=0nyiji(xxj)ji(xixj)=i=0nyi(xx0)(xx1)(xxi1)(xxi+1)(xxn)(xix0)(xix1)(xixi1)(xixi+1)(xixn)

从形式上看,Lagrange 插值法是容易实现的,但如果加入新的数据点,则需要重新计算多项式系数,即算法随着数据点的增多不能复用以前的计算结果。

拉格朗日插值 Matlab 程序代码

艾特肯插值

首先,由点 (x0,y0)(xj,yj),j=1,2,,n 可以确定 n 组一次多项式,即穿过两点的直线;第二步,根据 $$,进一步生成 n1 组二次多项式。次过程共重复 n 次,最终得到一个 n 次多项式。

具体而言,由点 (x0,y0)(x1,y1) 得到的一次多项式为

p01(x)=xx1x0x1y0xx0x1x0y1=1x1x0|y0x0xy1x1x|

类比之,由 x0xj 确定的一次多项式表示为

p0j(x)=1xjx0|y0x0xyjxjx|,j=1,2,,n

进一步,由点 (x0,y0),(x1,y1),(xj,yj) 确定的二次多项式为

p01j(x)=1xjx1|p01(x)x1xp0j(x)xjx|,j=2,3,,n

一般而言,对于 k+2 个数据点 (x0,y0),(x1,y1),,(xk,yk)(xj,yj)k+1 次插值多项式为

p012kj(x)=1xjxk|p012k(x)xkxp012(k1)(x)xjx|j=k+1,,n

整个计算过程如下表

xjyjp0jp01jp012jp0123jxjxx0y0x0xx1y1p01x1xx2y2p02p012x2xx3y3p03p013p0123x3xx4y4p04p014p0124p01234x4xxnynp0np01np012np0123nxnx

艾特肯插值 Matlab 程序代码