一、引言

在数值分析中,拉格朗日插值法是以法国十八世纪数学家约瑟夫.拉格朗日命名的一种多项式插值方法。许多实际问题中都用函数来表示某种内在联系和规律,而不少函数都只能通过实验或观测来了解。如对实验中的某个物理量进行观测,在若干个不同的地方得到相应的观测值,拉格朗日插值法可以找到一个多项式,其恰好在各个观测点取到观测到的值。这样的多项式称为拉格朗日多项式。

数学上来讲,拉格朗日插值法可以给出一个恰好穿过二维平面上若干个已知点的多项式函数。

对于给定的n+1n+1n+1个点(x0,y0)  ,  (x1,y1)  ,  ⋯  ,  (xn,yn)(x_0,y_0)\;,\;(x_1,y_1)\;,\;\cdots\;,\;(x_n,y_n)(x0,y0),(x1,y1),,(xn,yn),对应于它们的次数都不超过nnn的拉格朗日多项式LLL只有一个。如果计入次数更高的多项式,则有无穷个,因为所有与LLL相差λ(x−x0)(x−x1)⋯(x−xn)\lambda(x-x_0)(x-x_1)\cdots(x-x_n)λ(xx0)(xx1)(xxn)的多项式都满足条件。例如:

已知平面上四个点:(-9,5)、(-4,2)、(-1,-2)、(7,9),拉格朗日多项式L(x)L(x)L(x)(黑色)穿过所有点。而每个基本多项式y0l0(x)  ,  y1l1(x)  ,  y2l2(x)  ,  y3l3(x)y_0l_0(x)\;,\;y_1l_1(x)\;,\;y_2l_2(x)\;,\;y_3l_3(x)y0l0(x),y1l1(x),y2l2(x),y3l3(x)各穿过对应的一点,并在其他的三个点的xxx值上取0。

二、定义

对某个多项式函数,已知有给定的k+1k+1k+1个取值点:
(x0,y0)  ,  (x1,y1)  ,  ⋯  ,  (xk,yk) (x_0,y_0)\;,\;(x_1,y_1)\;,\;\cdots\;,\;(x_k,y_k) (x0,y0),(x1,y1),,(xk,yk)
其中,xjx_jxj对应着自变量的位置,而yjy_jyj对应着函数在这个位置的取值。

假设任意两个不同的xjx_jxj都互不相同,那么应用拉格朗日插值公式所得到的拉格朗日插值多项式为:
L(x):=∑j=0kyjlj(x) L(x):=\sum_{j=0}^ky_jl_j(x) L(x)=j=0kyjlj(x)
其中,每个lj(x)l_j(x)lj(x)为拉格朗日基本多项式(或称插值基函数),其表达式为:
lj(x):=∏i=0,i≠jkx−xixj−xi=x−x0xj−x0⋯x−xj−1xj−xj−1x−xj+1xj−xj+1⋯x−xkxj−xk l_j(x):=\prod_{i=0,i\neq j}^k\frac{x-x_i}{x_j-x_i}=\frac{x-x_0}{x_j-x_0}\cdots \frac{x-x_{j-1}}{x_j-x_{j-1}}\frac{x-x_{j+1}}{x_j-x_{j+1}}\cdots\frac{x-x_k}{x_j-x_k} lj(x):=i=0,i=jkxjxixxi=xjx0xx0xjxj1xxj1xjxj+1xxj+1xjxkxxk
拉格朗日基本多项式lj(x)l_j(x)lj(x)的特点是在xjx_jxj上的取值为1,在其他的点xi  ,  i≠jx_i\;,\;i\neq jxi,i=j上取值为0。

三、范例

假设有某个二次多项式函数fff,已知它在三个点上的取值为:
f(4)=10  ,  f(5)=5.25  ,  f(6)=1 f(4)=10\;,\;f(5)=5.25\;,\;f(6)=1 f(4)=10,f(5)=5.25,f(6)=1
需要求f(18)f(18)f(18)的值。

首先写出每个拉格朗日基本多项式:
l0(x)=(x−5)(x−6)(4−5)(4−6) l_0(x)=\frac{(x-5)(x-6)}{(4-5)(4-6)} l0(x)=(45)(46)(x5)(x6)
l1(x)=(x−4)(x−6)(5−4)(5−6) l_1(x)=\frac{(x-4)(x-6)}{(5-4)(5-6)} l1(x)=(54)(56)(x4)(x6)
l2(x)=(x−4)(x−5)(6−4)(6−5) l_2(x)=\frac{(x-4)(x-5)}{(6-4)(6-5)} l2(x)=(64)(65)(x4)(x5)
然后应用拉格朗日插值法,就可以得到PPP的表达式(PPP为函数fff的插值函数):
P(x)=f(4)l0(x)+f(5)l1(x)+f(6)l2(x) P(x)=f(4)l_0(x)+f(5)l_1(x)+f(6)l_2(x) P(x)=f(4)l0(x)+f(5)l1(x)+f(6)l2(x)
代入我们上面的公式:
P(x)=14(x2−28x+136) P(x)=\frac{1}{4}(x^2-28x+136) P(x)=41(x228x+136)
此时代入数值18就可以得到所求之值:
f(18)=P(18)=−11 f(18)=P(18)=-11 f(18)=P(18)=11

四、证明

1. 存在性

对于给定的k+1k+1k+1个点:(x0,y0)  ,  (x1,y1)  ,  ⋯  ,  (xk,yk)(x_0,y_0)\;,\;(x_1,y_1)\;,\;\cdots\;,\;(x_k,y_k)(x0,y0),(x1,y1),,(xk,yk),拉格朗日插值法的思路是找到一个在一点xjx_jxj取值为1,而在其他点取值为0的多项式lj(x)l_j(x)lj(x)。这样,多项式yjlj(x)y_jl_j(x)yjlj(x)在点xjx_jxj取值为yjy_jyj,而在其他点取值都为0。

而多项式L(x)=∑j=0kyjlj(x)L(x)=\sum_{j=0}^ky_jl_j(x)L(x)=j=0kyjlj(x)就可以满足:
L(xj)=∑j=0kyili(xj)=0+0+⋯+yj+⋯+0=yj L(x_j)=\sum_{j=0}^ky_il_i(x_j)=0+0+\cdots+y_j+\cdots+0=y_j L(xj)=j=0kyili(xj)=0+0++yj++0=yj
在其他点取值为0的多项式容易找到,例如:
(x−x0)(x−x1)⋯(x−xj−1)(x−xj+1)⋯(x−xk) (x-x_0)(x-x_1)\cdots(x-x_{j-1})(x-x_{j+1})\cdots(x-x_k) (xx0)(xx1)(xxj1)(xxj+1)(xxk)
它在点xjx_jxj取值为:
(xj−x0)(xj−x1)⋯(xj−xj−1)(xj−xj+1)⋯(xj−xk) (x_j-x_0)(x_j-x_1)\cdots(x_j-x_{j-1})(x_j-x_{j+1})\cdots(x_j-x_k) (xjx0)(xjx1)(xjxj1)(xjxj+1)(xjxk)
由于已经假定xix_ixi互不相同,因此上面的取值不等于0,将多项式除以这个取值,就能得到一个满足“在xjx_jxj取值为1,在其他店取值为0”的多项式。
lj(x):=∏i=0,i≠jkx−xixj−xi=x−x0xj−x0⋯x−xj−1xj−xj−1x−xj+1xj−xj+1⋯x−xkxj−xk l_j(x):=\prod_{i=0,i\neq j}^k\frac{x-x_i}{x_j-x_i}=\frac{x-x_0}{x_j-x_0}\cdots \frac{x-x_{j-1}}{x_j-x_{j-1}}\frac{x-x_{j+1}}{x_j-x_{j+1}}\cdots\frac{x-x_k}{x_j-x_k} lj(x):=i=0,i=jkxjxixxi=xjx0xx0xjxj1xxj1xjxj+1xxj+1xjxkxxk
这就是拉格朗日基本多项式。

2. 唯一性

次数不超过kkk的拉格朗日多项式至多只有一个,因为对任意两个次数不超过kkk的拉格朗日多项式:p1  ,  p2p_1\;,\;p_2p1,p2。它们的差p1−p2p_1-p_2p1p2在所有k+1k+1k+1个点上取值都为0,因此必然是多项式(x−x0)(x−x1)⋯(x−xj−1)(x−xj+1)⋯(x−xk)(x-x_0)(x-x_1)\cdots(x-x_{j-1})(x-x_{j+1})\cdots(x-x_k)(xx0)(xx1)(xxj1)(xxj+1)(xxk)的倍数。

因此,如果这个差p1−p2p_1-p_2p1p2不等于0,次数就一定不小于k+1k+1k+1。但是p1−p2p_1-p_2p1p2是两个次数不超过kkk的多项式之差,它的次数也不超过kkk

所以p1−p2=0p_1-p_2=0p1p2=0,也就是说p1=p2p_1=p_2p1=p2,这就证明了唯一性。

五、优点与缺点

拉格朗日插值法的公式结构整齐紧凑,在理论分析中十分方便,然而在计算中,当插值点增加或减少一个时,所对应的基本多项式就需要全部重新计算,于是整个公式都会变化,非常繁琐。这时可以用重心拉格朗日插值法或牛顿插值法来代替。

此外,当插值点比较多的时候,拉格朗日插值多项式的次数可能会很高,因此具有数值不稳定的特点,也就是说尽管在已知的几个点取到给定的数值,但在附近却会和“实际上”的值之间有很大的偏差。

这类现象也被称为龙格现象,解决的办法是分段用较低次数的插值多项式。

六、重心拉格朗日插值法

重心拉格朗日插值法是拉格朗日插值法的一种改进。

在拉格朗日插值法中,运用多项式:
l(x)=(x−x0)(x−x1)⋯(x−xk) l(x)=(x-x_0)(x-x_1)\cdots(x-x_k) l(x)=(xx0)(xx1)(xxk)

拉格朗日插值法的数值稳定性:如图,用于模拟一个十分平稳的函数时,插值多项式的取值可能会突然出现一个大的偏差(图中的14至15中间)

可以将拉格朗日基本多项式重新写为:
lj(x)=l(x)x−xj1∏i=0,i≠jk(xj−xi) l_j(x)=\frac{l(x)}{x-x_j}\frac{1}{\prod_{i=0,i\neq j}^k(x_j-x_i)} lj(x)=xxjl(x)i=0,i=jk(xjxi)1
定义重心权:
ωj=1∏i=0,i≠jk(xj−xi) \omega_j=\frac{1}{\prod_{i=0,i\neq j}^k(x_j-x_i)} ωj=i=0,i=jk(xjxi)1
上面的表达式可以简化为:
lj(x)=l(x)ωjx−xj l_j(x)=l(x)\frac{\omega_j}{x-x_j} lj(x)=l(x)xxjωj
于是拉格朗日插值多项式变为:
L(x)=l(x)∑j=0kωjx−xjyj L(x)=l(x)\sum_{j=0}^k\frac{\omega_j}{x-x_j}y_j L(x)=l(x)j=0kxxjωjyj
即所谓的重心拉格朗日插值公式(第一型)或改进拉格朗日插值公式。

它的优点是当插值点的个数增加一个时,将每个ωj\omega_jωj都除以(xj−xk+1)(x_j − x_{k + 1})(xjxk+1),就可以得到新的重心权wk+1w_{k + 1}wk+1,计算复杂度为O(n)\mathcal O(n)O(n),比重新计算每个基本多项式所需要的复杂度O(n2)\mathcal O(n^2)O(n2)降了一个量级。

将以上的拉格朗日插值多项式用来对函数g(x)≡1g(x)\equiv 1g(x)1插值,可以得到:
∀x, g(x)=l(x)∑j=0kωjx−xj \forall x,\,g(x)=l(x)\sum_{j=0}^k\frac{\omega_j}{x-x_j} x,g(x)=l(x)j=0kxxjωj
因为g(x)≡1g(x)\equiv 1g(x)1是一个多项式。

因此,将L(x)L(x)L(x)除以g(x)g(x)g(x)后可得到:
L(x)=∑j=0kωjx−xjyj∑j=0kωjx−xj L(x)=\frac{\sum_{j=0}^k\frac{\omega_j}{x-x_j}y_j}{\sum_{j=0}^k\frac{\omega_j}{x-x_j}} L(x)=j=0kxxjωjj=0kxxjωjyj
这个公式被称为重心拉格朗日插值公式(第二型)或真正的重心拉格朗日插值公式。它继承了(1)式容易计算的特点,并且在代入xxx值计算L(x)L(x)L(x)的时候不必计算多项式l(x)l(x)l(x)

它的另一个优点是,结合切比雪夫节点进行插值的话,可以很好地模拟给定的函数,使得插值点个数趋于无穷时,最大偏差趋于零。同时,重心拉格朗日插值结合切比雪夫节点进行插值可以达到极佳的数值稳定性。第一型拉格朗日插值是向后稳定的,而第二型拉格朗日插值是向前稳定的,并且勒贝格常数很小。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐