【问题标题】:Multiple integral using scipy.integrate.nquad - errors on lambda function使用 scipy.integrate.nquad 的多重积分 - lambda 函数上的错误
【发布时间】: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 表示我可以传入的任意数量的uintegrate.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


【解决方案1】:

由于 cmets 部分超载,因此发布了一些 cmets 作为答案。

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

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

(3) 熵计算的积分域是所谓的概率函数的支持,即概率大于零的集合。 c(u)的支持是什么?这定义了集成领域。教科书或其他说明中习惯说域是 R 或 (-inf, +inf) 或以其他方式使其模棱两可,但对于实际计算,您需要将其缩减为支持。

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

【讨论】:

  • 我意识到,通过偷工减料,回答问题所需的必要背景甚至不符合我自己的标准。现在请在编辑中查看更新后的图像,其中我对多重积分及其支持进行了更全面的阐述
  • 我已经弄清楚如何正确添加支持。它必须是可迭代的:ranges = [(0,1) for i in range(n)]
  • 太好了,很高兴听到您解决了这个问题。我会记住的,以防我再次碰到它。
猜你喜欢
  • 2020-09-13
  • 2019-01-07
  • 2016-06-24
  • 2021-04-18
  • 2019-01-23
  • 1970-01-01
  • 2021-07-23
  • 1970-01-01
  • 2018-07-11
相关资源
最近更新 更多