为什么scipy.integrate.quad在此积分的某个间隔内失败

问题描述 投票:0回答:1

要复制

# use scipy to create random number for f(x) = 2x when x in [0,1] and 0, otherwise
from scipy.stats import rv_continuous
class custom_rv(rv_continuous):
    "custom distribution"
    def _pdf(self, x):
        if x >= 0.0 and x <=1.0:
            return 2*x
        else:
            return 0.0
rv = custom_rv(name='2x')
from scipy.integrate import quad
print(quad(rv._pdf, -10.0, 10.0))
print(quad(rv._pdf, -5.0, 5.0))
print(quad(rv._pdf, -np.inf, np.inf))

输出

(0.0, 0.0) # for [-10,10]
(1.0, 1.1102230246251565e-15) # for [-5,5]
(1.0, 2.5284034865791227e-09) # for [-inf,inf]

上下文

我正在尝试使用自定义p.d.f创建随机变量:如果x在[0,1]中,则f(x)= 2 * x,否则f(x)= 0。

此随机变量无效,我尝试使用quad通过检查p.d.f的积分进行调试。

我发现是积分不一致。对于(-inf,inf)和(-5,5)之类的一些间隔,它是1。但是,对于(-10,10)之类的间隔,它被评估为零,这是非常意外的。

任何想法这里出了什么问题吗?

谢谢!

python random scipy probability-density
1个回答
1
投票

看一下quad function documentation,如果一直走到最底端,您将看到:

请注意,与积分间隔的大小可能无法使用正确地积分这种方法。此限制的一个简化示例是集成一个y轴反射阶跃函数,其中积分范围。

提供的示例是:

>>> y = lambda x: 1 if x<=0 else 0
>>> integrate.quad(y, -1, 1)
(1.0, 1.1102230246251565e-14)
>>> integrate.quad(y, -1, 100)
(1.0000000002199108, 1.0189464580163188e-08)
>>> integrate.quad(y, -1, 10000)
(0.0, 0.0)

所以想法是您的函数不够“平滑”,这就是为什么您可以获得令人惊讶的结果的原因。

© www.soinside.com 2019 - 2024. All rights reserved.