Search code examples
pythonscipystatisticsintegralentropy

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


The code below uses double integration with scipy.integrate.dblquad to calculate the differential entropy, c*np.log(c), of a copula density function c, which has one dependence parameter, theta, usually positive. Formula can be found here.

enter image description 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] 

Calling the function with

copula_entropy(1)

returns the error

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

How can the function be made to work?


Solution

  • The first argument must be a callable, so just wrap it in a lambda itself:

    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] 
    

    (Please note that I also changed the expression for c according to the formula you gave).