scipy.interpolate.UnivariateSpline中的bbox agrument是做什么的?

时间:2017-08-27 12:25:05

标签: python scipy interpolation

时,我对(0,1)spline.integral(0,1)的整合得到了完全不同的答案
spline = UnivariateSpline(x, y, bbox=[0,1], k=3.0,s=0.0)

spline = UnivariateSpline(x, y, k=3.0,s=0.0)

,后者产生的结果明显低于第一个。所以我想知道bbox参数实际上是做什么的?我的x向量的一个例子是[0.0518429, 0.102736, 0.153367, 0.254166, 0.354551, 0.404618, 0.454606, 0.479576, 0.504523, 0.529457, 0.554374, 0.604159, 0.653876, 0.753149, 0.85219, 0.901613, 0.970617],因此x包含在(0,1)

1 个答案:

答案 0 :(得分:2)

TL; DR:你正在整合两个不同的样条线。

bbox参数本身与锡上的内容完全相同,https://docs.scipy.org/doc/scipy/reference/generated/scipy.interpolate.UnivariateSpline.html

bbox : (2,) array_like, optional 2-sequence specifying the boundary of the approximation interval. If None (default), bbox=[x[0], x[-1]].

我同意,措辞有点神秘。一个简单的例子有助于:

In [1]: from scipy.interpolate import UnivariateSpline

In [2]: import numpy as np

In [4]: x = np.array([0.2, 0.4, 0.6, 0.8])

In [5]: y = x**4

In [6]: s1 = UnivariateSpline(x, y, s=0)

In [7]: s1.get_coeffs()
Out[7]: array([ 0.0016,  0.0176,  0.0096,  0.4096])

In [8]: s1.get_knots()
Out[8]: array([ 0.2,  0.8])

现在,指定bbox会更改样条线:

In [15]: s2 = UnivariateSpline(x, y, s=0, bbox=[0, 1])

In [16]: s2.get_knots()
Out[16]: array([ 0.,  1.])

因此,如果您将每个样条曲线整合到它们的基本区间内,而不依赖于外推,那么一切似乎都很好:

In [23]: s2.integral(0, 1)
Out[23]: 0.19493333333333332

In [24]: s1.integral(0.2, 0.8)
Out[24]: 0.06576000000000003

In [25]: (0.8**5 - 0.2**5) / 5
Out[25]: 0.06547200000000002

然而,一旦你尝试在更长的时间间隔内整合s1,它就会爆炸:

In [26]: s1.integral(0.2, 0.8) - s1.integral(0, 1)
Out[26]: 0.0

请注意,它不应该这样做:默认是推断,所以它应该是非零的。这实际上可能是一个错误。