2016-10-12 10 views
0

python/scipyを使用して2つの制限の間の積分を計算しようとしています。Scipyとの統合で、負の下限値で不正確な結果が返される

オンライン計算機を使用して結果を再確認しています(http://www.wolframalpha.com/widgets/view.jsp?id=8c7e046ce6f4d030f0b386ea5c17b16ahttp://www.integral-calculator.com/)。特定の制限が設定されていると私の結果には不一致があります。

使用されるコードは次のとおりです。

import scipy as sp 
import numpy as np 

def integrand(x): 
    return np.exp(-0.5*x**2) 

def int_test(a,b): 
    # a and b are the lower and upper bounds of the integration 
    return sp.integrate.quad(integrand,a,b) 

に(a、b)は制限を設定する場合(-np.inf、1)私は(2.10894 ...) に同意答えを得るが、私が設定している場合(-np.inf、300)私はゼロの答えを得ます。さらに調査では

使用:

for i in range(50): 
    print(i,int_test(-np.inf,i)) 

を私は私= 36で結果がうまくいかないことがわかります。

これを避ける方法があるかどうか疑問に思っていましたか?

おかげで、

マット

+0

いくつかの提案された解決策を用いて同様の質問が検討されました(http://stackoverflow.com/questions/39515582/scipy-integrate-quad-precision-on-big-numbers/39517294#39517294)。この積分に特に関心があるなら、閉じた形で見つけることができます。あるいは 'np.sqrt(2 * np.pi)*(1-scipy.stats.norm.sf(i))' – Stelios

答えて

1

は、私は、これは無限の境界に関係している推測しています。 scipy.integrate.quadはquadpackルーチンのラッパーです。最後に

https://people.sc.fsu.edu/~jburkardt/f_src/quadpack/quadpack.html

、これらのルーチンは、適切な間隔を選択し、関数評価し、次に数値積分による積分値を取得しよう。これは、関数評価のステップをどの程度細かく行うことができるかをあなたが知っていると仮定すると、有限積分では問題ありません。

無限積分については、アルゴリズムがそれぞれの部分区間をどれくらいうまく選び、どれくらい正確に計算されるかによって決まります。

私のアドバイス:無限積分の正確な値に興味がある場合は、数値積分ソフトウェアAT ALLを使用しないでください。

問題が分析的に解決できる場合は、その問題を特定の範囲に限定してください。

関連する問題