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

时间:2018-02-07 18:47:49

标签: python numpy scipy spline

运行以下代码:

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()

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

plot of a spline

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

另外,我理解通过强加"自然"样条边界条件我绝对更适合这个特定的函数,但我试图理解bc_type参数的工作原理。

1 个答案:

答案 0 :(得分:1)

文档说:

  

根据第一个和最后一个时间间隔推断出越界点

例如,它对x< -3是使用与-3(< 3)相同的公式。 x< -2,结之间最左边的间隔。类似地,x的公式> 4与3< 3< 3相同。 x< 4.

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

简单地说,这种推断是没用的。样条不是,并且从未被认为是有用的外推工具。

InterpolatedUnivariateSpline对于外推有一个更明智的选择,即最近的边界值(通过水平线扩展图形)。但如果您想要实际遵循数据大规模行为的内容,请不要查看scipy.interpolate模块:请从curve_fit查看optimization