python中二重积分的正确计算

2024-09-30 18:31:41 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图用scipy计算一个二重积分。被积函数有点复杂,因为它包含一些概率分布,以加权x和y的每个值的可能性(就像一个混合模型)。以下代码的计算结果为负数,但它应被[0,1]绑定。另外,计算大约需要半个小时。在

我有两个问题。在

1)有没有更好的方法来计算这个积分?在

2)这个负值从何而来?对我来说,最大的问题是如何加快计算速度,因为我可以在我的代码中找到导致我以后自己负的错误。在

from scipy import stats
from scipy.integrate import dblquad
import itertools

p= [list whose entries are each different stats.beta(a,b) distributions]

def integrand(x,y):
        delta=x-y
        marg=0
        for distA,distB in itertools.permutations(p,2):
                first=distA.pdf(x)
                second=distB.pdf(y)
                weight1=0
                weight2=0
                for distC in p:
                        if distC == distA:
                                continue
                        w1=distC.cdf(x)-distC.cdf(y)
                        if weight1 == 0:
                                weight1=w1
                        else:
                                weight1=weight1*w1
                marg+=(first*weight1*second)
        I=delta*marg
        return I

expect=dblquad(integrand,0,1,lambda x: 0, lambda x: x)

这本质上是问两点之间的最大距离在分布向量中的期望值是多少。积分的极限是y∊[0,x]和x∊[0,1]。这给了我-.49,估计的积分误差在10e-10级,所以它不应该是由于积分方法。在

我已经和这件事斗争了一段时间了,感谢你的帮助。谢谢。在

编辑:更正了打字错误


Tags: 方法代码fromimportstats错误scipyw1
2条回答

积分法给出的误差只是一个数字,告诉你收敛性有多好。你试过计算被积函数的显式值吗?在

顺便问一下:你在整合pdf吗?如果是:您确定您的集成限制吗?在

有几种方法可以提高计算速度。在

  1. 您可以使用epsabsepsrel参数来dblquad来增加集成的可靠性。当然,您的结果会不太准确,但对于调试来说,这是可以的。

  2. 您可以通过重新排序代码(警告,未测试代码)来显著减少integrand中函数求值的数量

    def integrand(x, y):
        marg = 0.0
        cdf = dict((id(distC), distC.cdf(x) - distC.cdf(y)) for distC in p)
        for distA in p:
            weight = numpy.prod(cdf[id(distC)]
                                for distC in p if distC is not distA)
            marg += weight * distA.pdf(x) * sum(
                distB.pdf(y) for distB in p if distB is not distA)
        return (x-y) * marg
    

    但是请注意,Python在函数调用方面有相当大的开销,因此用纯Python编写这篇文章不会让您走得太远(在这个问题上使用Cython之类的方法可能会有所帮助)。

我不知道为什么积分变为负。也许我可以告诉你,如果你能给出一个p的例子,这将使我们能够真正地尝试你的代码。在

相关问题 更多 >