运行以下代码:
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()
产生估计,其中外推尾部向下弯曲:
为什么尾部在外推区域弯曲?我的直觉是估计值可以合理地近似样条内部区域的抛物线,尾部值是线性外推的结果。
另外,我理解通过强加"自然"样条边界条件我绝对更适合这个特定的函数,但我试图理解bc_type
参数的工作原理。
答案 0 :(得分:1)
文档说:
根据第一个和最后一个时间间隔推断出越界点
例如,它对x< -3是使用与-3(< 3)相同的公式。 x< -2,结之间最左边的间隔。类似地,x的公式> 4与3< 3< 3相同。 x< 4.
这些将是一些三次多项式,它们插入两个它们应该插值的值,但是不能期望它遵循函数中的任何大规模模式。
简单地说,这种推断是没用的。样条不是,并且从未被认为是有用的外推工具。
InterpolatedUnivariateSpline对于外推有一个更明智的选择,即最近的边界值(通过水平线扩展图形)。但如果您想要实际遵循数据大规模行为的内容,请不要查看scipy.interpolate
模块:请从curve_fit
查看optimization
。