簡體   English   中英

使用np.inf進行scipy中四元集成的限制

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM