python - 使用 scipy.integrate.nquad 进行多重积分 - lambda 函数上的错误
问题描述
对于copula 密度函数的高于双变量版本( ),我在下面的代码中尝试了以下多重积分。换句话说,维度。n=2
c(u1,u2)
n>2
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
的任意数量的。 的第二个输入参数,即,是积分的 [0,1] 支持,因为' 的维度,我试图在上面的推导中解释。但是,这部分代码给出了以下错误。u
integrate.nquad
ranges=(0,1)**n
n
u
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
?该文档没有给出匹配的示例。
解决方案
由于评论部分已超载,因此发布了一些评论作为答案。
(1) 我认为(0, 1)**2
你的意思是说乘积 (0, 1) x (0, 1),即单位平方。我认为 Python 不会理解这一点。如果您需要告诉 nquad 积分域是单位平方,我认为您需要以其他方式说。
(2) 请发布您实际使用的函数的公式,即 c(u)。请记住,当您省略细节或将它们推迟到链接时,只会让其他人更难理解,因此您获得有效帮助的可能性会降低。
(3) 熵计算的积分域就是所谓的概率函数的支持,即概率大于零的集合。c(u)的支持是什么?这定义了集成领域。在教科书或其他说明中习惯说域是 R 或 (-inf, +inf) 或以其他方式使其模棱两可,但对于实际计算,您需要将其缩减为支持。
对不起,我不能提供更多帮助,这是一个有趣的问题。
推荐阅读
- hibernate - 在@Formula 中,引用此公式之外的连接依赖项(不是子选择,也不是此对象)
- reactjs - 使用 2 个单独的项目捕获 Windows 身份验证(凭据)。React 前端和 .NET Core 后端
- swiftui - 如何在swiftui中进行下拉
- typescript - 允许一个属性使用不同的 Typescript 类型
- selenium - 如何在黄瓜特征文件表中提供文件路径
- android - 将事件侦听器与其他类 android 的上下文一起使用
- optimization - How to optimize 2 identical kernels with 50% occupancy that could run concurrently in CUDA?
- javascript - 删除 Rangeslider 上的值 (HTML/CSS/Jquery)
- rest - 如何(如果可能)使用更改参数的 REST 请求运行 Gatling 测试?
- amazon-web-services - 将 SQL 文件导入弹性 beantalk 中创建的数据库的最佳方法是什么