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

问题描述

Natural Cubic Spline背后的一个假设是,在插值间隔的端点处,样条多项式的二阶导数设置为等于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,"p",color="red")
plt.plot(t,runge_f(t),color="black")
plt.plot(t,cs(t),color="lightblue")

plt.show()

Natural Cubic Spline extrapolation

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

解决方法

样条曲线在端点处的曲率(二阶导数)确实为0,您可以通过运行此操作进行检查

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

用于计算x插值间隔两端的二阶导数。但是,这并不意味着样条线超出限制范围-继续作为三次多项式。如果要在范围外线性外推,则必须自己进行。推算平面很容易:用{p>替换您的cs=..

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

得到这样的东西: extrapolate flat

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