龙格现象


Ⅰ. 背景 –> Ⅱ. 示例 –> Ⅲ. Python 代码


Ⅰ. 背景

对于某些本源函数,一般情况,如果已知的数据点列越多,构造出的插值多项式阶数越高,预测的函数值相对也会越准确. 但在插值区间的边缘,误差可能会超乎人类想象. 边缘剧烈的震荡带来的巨大的误差,数学家们称之为 Runge Phenomenon,龙格现象.


Ⅱ. 示例

以拉格朗日插值多项式为例,本源函数选取“龙格函数”,观察如下 .gif 动画结果:

{\rm Runge}(x)=\dfrac{1}{1+25x^2},\ \ \ \ x\in[-1,1]

龙格现象

观察到,随着拉格朗日插值多项式阶数的增高,插值区间边缘的函数值跳动剧烈,并且这种震荡不断的现象似乎有着向原点逼近的趋势.

这种用高阶多项式插值带来的边缘函数值剧烈震荡(Oscillate violently),最先由德国数学家 Carl Runge 发现,因此,翻译为“龙格现象”.


Ⅲ. Python 代码

Runge.py 代码调用的 LAGRANGE 自定义类见:

拉格朗日插值

Runge.py
 1import matplotlib.pyplot as plt
 2from Lagrange import LAGRANGE
 3
 4def Chart() -> None:
 5    plt.ion()
 6    for order in range(2, 50+2, 1):
 7        plt.cla()
 8        plt.axis([-2.5, 2.5, -3, 3])
 9
10        X = np.linspace(-1, 1, 300)
11        Y = list(
12            map(lambda x: 1 / (1 + 25 * (x * x)), X)
13        )
14        plt.plot(X, Y, 'r-.')
15        del X
16        del Y
17
18        X = np.linspace(-1, 1, order)
19        Y = list(
20            map(lambda x: 1 / (1 + 25 * (x * x)), X)
21        )
22        obj = LAGRANGE(X=X.tolist(), Y=Y)
23        del X
24        del Y
25
26        X = np.linspace(-1, 1, 500)
27        prediction = []
28        for i in range(0, len(X), 1):
29            prediction.append(obj.Interpolate(X[i]))
30        plt.plot(X, prediction, 'b-', linewidth=0.5)
31        del X
32
33        plt.title(f'The Order of Lagrange Interpolation: {order-1}')
34        plt.legend(['Runge', 'Lagrange'])
35        plt.pause(0.2)
36    plt.ioff()
37    plt.show()
38
39
40Chart()