使用自然三次样条外推时的曲率

Curvature when extrapolated using Natural Cubic Spline

Natural Cubic Spline 背后的假设之一是在插值区间的端点,样条多项式的二阶导数设置为等于 0。我试图证明使用 Natural示例中通过 from scipy.interpolate import CubicSplines 的三次样条(下面的代码)。

from scipy.interpolate import CubicSpline
from numpy import linspace

import matplotlib.pyplot as plt

runge_f = lambda x: 1 / (1 + 25*x**2)

x = linspace(-2, 2, 11)
y = runge_f(x)
cs = CubicSpline(x, y, bc_type = "natural")
t = linspace(-5, 5, 1000)

plt.plot(x, y, "p", color="red")
plt.plot(t, runge_f(t), color="black")
plt.plot(t, cs(t), color="lightblue")

plt.show()

在给出的示例中,外推点的曲率不等于零 - 区间外的外推在自然三次样条中不应该是线性的吗?

样条在端点处的曲率(二阶导数)确实为0,你可以通过运行这个

检查
print(cs(x[0],2), cs(x[-1], 2))

计算 x 插值区间两端的二阶导数。然而,这并不意味着样条曲线是平坦的 超出 限制 - 它继续作为三次多项式。如果你想在范围之外进行线性外推,你必须自己做。很容易推断平坦:将 cs=.. 行替换为

from scipy.interpolate import interp1d
cs = interp1d(x,y,fill_value = (y[0],y[-1]), bounds_error = False)

得到这样的东西:

但线性外推需要更多工作。我不确定是否有一个 Python 函数(或者我确定有一个我只是不知道它是什么)