当
时,我对(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)
答案 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
请注意,它不应该这样做:默认是推断,所以它应该是非零的。这实际上可能是一个错误。