I am having difficulty computing multiple integrals of functions with taking array inputs. I would like to use scipy.integrate's nquad function
because I need to be able to integrate from -np.inf to np.inf
(I'm working with probability density functions). The issue is nquad expects a function to be formulated like this:
function(x_1, x_2, ..., x_n)
The functions I need to integrate over take this form:
function(np.array([x_1, x_2, ..., x_n]))
Is there a way to change a function that takes an array to accept multiple arguments? If not, is there an alternative to nquad? I tried using quadpy, but it said my integral was over 31, when the actual value was 1.
Thanks for the help.
I have found the solution. I fixed the issue by creating a wrapper function taking in *args, converting args to a numpy array, and integrating the wrapper function.
Here's an example:
from scipy.integrate import nquad
from scipy.stats import multivariate_normal
mean = [0., 0.]
cov = np.array([[1., 0.],
[0., 1.]])
bivariate_normal = multivariate_normal(mean=mean, cov=cov)
def pdf(*args):
x = np.array(args)
return bivariate_normal.pdf(x)
integration_range = [[-18, 18], [-18, 18]]
nquad(pdf, integration_range)
Output: (1.000000000000001, 1.3429066352690133e-08)