首页 > 解决方案 > 使用 scipy.integrate.dblquad 在 Python 中双重集成 x*np.log(x)

问题描述

下面的代码使用双重积分来计算copula 密度函数scipy.integrate.dblquad的微分熵 ,它有一个依赖参数,通常为正。公式可以在这里找到。c*np.log(c)ctheta

在此处输入图像描述

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)

返回错误

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

如何使该功能起作用?

标签: pythonscipystatisticsintegralentropy

解决方案


第一个参数必须是可调用的,所以只需将其包装在一个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根据您给出的公式更改了表达式)。


推荐阅读