2017-08-27 10 views
1

私は後者が最初よりも著しく低いことから生成された結果で、scipy.interpolate.UnivariateSplineのbboxアシストは何をしますか?

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

対(0,1)spline.integral(0,1)

spline = UnivariateSpline(x, y, bbox=[0,1], 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:あなたは2つの異なるスプラインを織り交ぜています。

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]].

ない、私は同意するものとします。 bboxを指定して、今すぐ

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]) 

をスプラインに変更:簡単な例は、役立ちますあなたが外挿に頼らず、自分のベース・インターバル内の各スプラインを統合した場合、すべてが正常であると思われるので、

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をintegraingてみてください。

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

デフォルトでは外挿する必要があるので注意してください。ゼロ以外の値でなければなりません。これは実際にはバグかもしれません。

関連する問題