使用 scipy.integrate.dblquad 在 Python 中对 x*np.log(x) 进行双重积分

Double integration of x*np.log(x) in Python using scipy.integrate.dblquad

下面的代码使用 scipy.integrate.dblquad 的二重积分来计算 copula 密度函数 c 的微分熵 c*np.log(c),它有一个相关参数 theta,通常是积极的。可以找到公式here.

import numpy as np
from scipy import integrate 

def copula_entropy(theta):
    c = lambda v, u: ((1+theta)*(u*v)**(-1-theta)) * (u**(-theta) 
        + v**(-theta) -1)**(-1/theta-2)
    return -integrate.dblquad(c*np.log(c), 0, 1, lambda u: 0, lambda u: 1)[0] 

调用函数

copula_entropy(1)

returns错误

TypeError: loop of ufunc does not support argument 0 of type function which has no callable log method

如何使该功能发挥作用?

第一个参数必须是可调用的,所以只需将其包装在 lambda 本身中:

import numpy as np
from scipy import integrate 

def copula_entropy(theta):
    c = lambda v, u: ((1+theta)*(u*v)**(-1-theta)) * (u**(-theta)+v**(-theta)-1)**(-1/theta-2)
    return -integrate.dblquad(lambda u,v: c(v,u)*np.log(c(v,u)), 0, 1, lambda u: 0, lambda u: 1)[0] 

(请注意,我还根据您提供的公式更改了 c 的表达式)。