[英]Limits of quad integration in scipy with np.inf
這里有一個結果示例:
我通過高斯分布(mu = 800,sigma = 1)與〜+ -2sigma ppf和從-inf
到+inf
相同積分進行積分。 由於某種原因,第二個積分導致零,但在實踐中它應該更准確。
有人可以解釋,為什么會發生這樣的異常現象或者我犯了什么錯誤?
碼:
from scipy.integrate import quad
import numpy as np
from scipy.stats import norm
def integrand(x):
return x*norm.pdf(x, 800, 1)
print quad(integrand, norm.ppf(0.05, 800,1), norm.ppf(0.95, 800,1))
print quad(integrand, -np.inf, np.inf)
(719.9999999999894, 5.913323331834147e-11)
(0.0, 0.0)
編輯:順便說一句,當平均值很小(例如2)時,它工作正常 - 積分結果非常接近。
quad
使用啟發式算法,使用適應性集成步驟來減少時間計算。 功能是平坦的,它會更快。 所以在大的全球區間,它可能會錯過高峰。
你可以幫助quad
的建議“興趣點”,以幫助他找到困難的地區:
>>> quad(integrand,0,1000)
(3.8929062783235445e-32, 7.210678067622767e-32)
>>> quad(integrand,0,1000,points=[750])
(799.9999999999993, 2.0260999142842332e-07)
您可以使用full_output
關鍵字查看quad
調查的結果:
>>>quad(integrand,0,1000,full_output=True)[2]['rlist'].max()
3.8929062783235445e-32
這里quad
從不選擇被積函數值超過1e-31的點,所以它
推斷該函數無處不在。
似乎這種行為是預料之中的。
當積分極限如此巨大時 - 從-inf到inf, quad
很難找到800左右的相對較小的凸起,因此積分的結果將為零。
它在平均值很小時起作用的原因是因為第一個分裂quad
在給定范圍的中間做零,所以當平均值很小時,積分將在第一次分割時找到正值。 (可能它使用某種梯形積分,我不確定)。 因此,解決這個問題的方法是:或者給出實數的積分限制(使我們的搜索空間小得多)或者確保其中一個分裂將在范圍內找到正值。(例如,確保均值在零附近)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.