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

3

自然三次样条插值背后的假设之一是,在插值区间的端点处,样条多项式的二阶导数被设置为等于0。我尝试通过在示例中使用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()

Natural Cubic Spline extrapolation

在这个例子中,外推点的曲率不等于零 - 难道在自然三次样条外推之外的区间内不应该是线性的吗?
1个回答

2

在端点处的样条曲线的曲率(二阶导数)确实为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)

要得到像这样的结果: extrapolate flat

但是需要更多的工作来进行线性外推。我不确定是否有一个Python函数可以实现这一点(或者说我确信有这样一个函数,只是我不知道它是什么)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接