Scipy CubicSpline 外推在约束二阶导数时如何工作?

How does the Scipy CubicSpline extrapolation work when constraining the second derivative?

运行以下代码:

import matplotlib.pyplot as plt
import numpy as np
import scipy as sp
import scipy.interpolate

x = np.arange(-3, 4)
y = xs**2
spline = sp.interpolate.CubicSpline(x, y, bc_type=((2, 0), (2, 0)))

x2 = np.arange(-10, 11)
plt.plot(x2, spline(x2), label="y2")
plt.plot(x2, spline(x2, 1), label="y2'")
plt.plot(x2, spline(x2, 2), label="y2''")
plt.plot(x2, spline(x2, 3), label="y2'''")
plt.legend()
plt.show()

产生估计值,其中外推的尾部向下弯曲:

为什么外推区域的尾巴向下弯曲?我的直觉是估计值会合理地近似于样条内部区域的抛物线,尾部值是线性外推的结果。

此外,据我所知,通过施加 "natural" 样条边界条件,我对这个特定函数产生了更差的拟合,但我正在尝试了解 bc_type 参数的工作原理。

文档说:

extrapolate to out-of-bounds points based on first and last intervals

例如,它对 x < -3 所做的一切就是使用与 -3 < x < -2(节点之间的最左边间隔)相同的公式。同样,x > 4 的公式与用于 3 < x < 4 的公式相同。

这些将是一些三次多项式,它们对它们应该插入的两个值进行插值,但不能期望在函数中遵循任何大规模模式。

简单地说,这个外推是没有用的。样条曲线不是,也从未打算用作外推工具。

InterpolatedUnivariateSpline 有一个稍微更明智的外推选项,即通过最近的边界值(通过水平线扩展图形)。但是,如果您想要真正遵循数据的大规模行为的东西,请不要查看 scipy.interpolate 模块:而是从 optimization 中查看 curve_fit