2017-08-27 92 views
1

我得到完全不同的答案,集成了(0,1)spline.integral(0,1)scipy.interpolate.UnivariateSpline中的bbox agrument有什么作用?

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

无关紧要,我遇到'x = np.sort(np.random.uniform(size = 17))'和'y = 10 + np.randn(17)' – vgdev

回答

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 

然而,一旦你尝试integraing s1在较大的区间,它炸弹:

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

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