微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用 scipy.integrate.nquad 的多重积分 - lambda 函数的错误

如何解决使用 scipy.integrate.nquad 的多重积分 - lambda 函数的错误

我在下面的代码中尝试了以下多重积分,以获得高于 bivariate version (n=2) 的 copula 密度函数 c(u1,u2)。换言之,n>2 维。

enter image description here

import numpy as np
from scipy import integrate

def H(theta):
    c = lambda *us: ((1+theta)*np.prod(*us)**(-1-theta)) * (np.sum(*us **(-theta))-1)**(-1/theta-2)
    return -integrate.nquad(
        func   = lambda *us : c(*us)*np.log(c(*us)),ranges = (0,1)**n,args   = (theta,) 
        )[0] 

theta,n = 1,3
print(H(theta))

其中*us表示我可以传入的任意数量uintegrate.nquad的第二个输入参数ranges=(0,1)**n是[0,1] 由于 nu 维数支持积分,我试图在上面的推导中解释。但是,这部分代码给出了以下错误

  • TypeError: unsupported operand type(s) for ** or pow(): 'tuple' and 'int'

如果我按照错误的建议通过删除指数 ranges=(0,1) 将这个输入更改为 n,那么我会得到一个不同的错误

  • low,high = fn_range(*args)

    TypeError: cannot unpack non-iterable int object

我真的应该如何声明对 [(0,1)**n] 中的多重积分的 integrate.nquad 支持documentation 没有给出匹配的例子。

解决方法

发布一些评论作为答案,因为评论部分已经超载了。

(1) 我认为 (0,1)**2 您的意思是说乘积 (0,1) x (0,1),即单位平方。我认为 Python 不会理解这一点。如果您需要告诉 nquad 积分域是单位平方,我认为您需要以其他方式说。

(2) 请贴出您实际使用的函数的公式,即 c(u)。请记住,当您省略细节或将它们放在链接中时,只会让其他人更难理解,因此您获得有效帮助的可能性也会降低。

(3) 熵计算的积分域就是所谓概率函数的支持度,即概率大于零的集合。 c(u) 的支持度是多少?这定义了集成域。在教科书或其他说明中,通常会说域是 R 或 (-inf,+inf) 或以其他方式使其含糊不清,但对于实际计算,您需要将其缩减为支持。

很抱歉,我不能提供更多帮助,这是一个有趣的问题。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。