【发布时间】:2021-01-13 16:21:22
【问题描述】:
我在下面的代码中尝试以下多重积分,以获得高于bivariate version (n=2) 的 copula 密度函数 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 表示我可以传入的任意数量的u。integrate.nquad 的第二个输入参数,即ranges=(0,1)**n,是积分的 [0,1] 支持,因为nu 的尺寸,我试图在上面的推导中解释。但是,这部分代码给出了以下错误。
TypeError: unsupported operand type(s) for ** or pow(): 'tuple' and 'int'
如果我按照错误的建议通过删除指数n 将此输入更改为ranges=(0,1),那么我会得到一个不同的错误:
-
low, high = fn_range(*args)TypeError: cannot unpack non-iterable int object
我真的应该如何在integrate.nquad 中声明[(0,1)**n] 支持多重积分? documentation 没有给出匹配的例子。
【问题讨论】:
-
您缺少与
c = lambda *us: np.prod( ((1+theta)*np.prod(us)**(-1-theta)) * (np.sum(u**(-theta))-1)**(-1/theta-2)处的第一个(匹配的)。它应该是c = lambda *us: np.prod(((1+theta)*np.prod(us)**(-1-theta)) * (np.sum(u**(-theta))-1)**(-1/theta-2))。你的身份也被破坏了 -
谢谢。抱歉缩进,错误也存在于我的固定代码中,但未反映在帖子中。无论如何,加上缺少的括号,我现在得到以下内容:
TypeError: unsupported operand type(s) for ** or pow(): 'tuple' and 'int'。我想解决任何进一步的错误,以便脚本实际工作 -
(0,1)**n应该做什么?您是否在交互式 Python 会话中测试过该表达式? -
它是基于
u的积分的支持,它是概率积分转换的边际分布(其范围为 [0,1])。它在ranges输入参数用于integrate.nquad的位置输入。我认为这就是如何编写 [0,1] docs.scipy.org/doc/scipy/reference/generated/… 的完整支持 -
错误描述性很强。
(0, 1)是一个不能提升为int的元组。(0,1)**n你到底想做什么?
标签: python lambda scipy syntax-error integral