2017-08-27 47 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 

請注意,它不應該這樣做:默認是外推,所以它應該是非零的東西。這實際上可能是一個錯誤。