龙格现象¶
Ⅰ. 背景 –> Ⅱ. 示例 –> Ⅲ. Python 代码
Ⅰ. 背景¶
对于某些本源函数,一般情况,如果已知的数据点列越多,构造出的插值多项式阶数越高,预测的函数值相对也会越准确. 但在插值区间的边缘,误差可能会超乎人类想象. 边缘剧烈的震荡带来的巨大的误差,数学家们称之为 Runge Phenomenon,龙格现象.
Ⅱ. 示例¶
以拉格朗日插值多项式为例,本源函数选取“龙格函数”,观察如下 .gif 动画结果:
观察到,随着拉格朗日插值多项式阶数的增高,插值区间边缘的函数值跳动剧烈,并且这种震荡不断的现象似乎有着向原点逼近的趋势.
这种用高阶多项式插值带来的边缘函数值剧烈震荡(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()