Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can I increase the number of subdivisions for functions in `scipy.integrate.dblquad`?

I'm using scipy.integrate.dblquad, and I get this error:

UserWarning: The maximum number of subdivisions (50) has been achieved.
If increasing the limit yields no improvement ...

I want to increase this limit to see if the integral is well-converged. The documentation specifies how to do this for scipy.integrate.quad (that function takes the maximum number of iterations as an argument), but not for scipy.integrate.dblquad. How can I increase the number of subdivisions for dblquad?

like image 416
Dan Avatar asked Jan 03 '14 23:01

Dan


People also ask

Which sub package and function is used for single integration in Scipy?

The scipy. integrate sub-package provides several integration techniques including an ordinary differential equation integrator. An overview of the module is provided by the help command: >>> help(integrate) Methods for Integrating Functions given function object.

How do you use Scipy Dblquad?

dblquad() method, we can get the double integration of a given function from limit a to b by using scipy. integrate. dblquad() method. Return : Return the double integrated value of a polynomial.

How do you numerically integrate in Python?

Numerical integrationis provided by the quad() function of the scipy. integrate module. It takes as input arguments the function f(x) to be integrated (the “integrand”), and the lower and upper limits a and b.


2 Answers

A simpler way of doing this is to use the nquad function instead of dblquad. Example code:

from scipy.integrate import nquad

options={'limit':100}
integral=nquad(func,[[xmin,xmax],[ymin,ymax]],
          args=(other_arg,),opts=[options,options])

Note that several of the arguments are lists. The elements of these lists apply to each of the coordinates in order. See the documentation for nquad here.

like image 110
Dan Avatar answered Sep 20 '22 13:09

Dan


According to the source code, dblquad calls quad, reading, simply:

return quad(_infunc,a,b,(func,gfun,hfun,args),epsabs=epsabs,epsrel=epsrel)

Therefore, you could implement this directly yourself with the additional maxp1 argument.

from scipy import integrate

def _infunc(x,func,gfun,hfun,more_args):
    a = gfun(x)
    b = hfun(x)
    myargs = (x,) + more_args
    return quad(func,a,b,args=myargs)[0]

def custom_dblquad(func, a, b, gfun, hfun, args=(), epsabs=1.49e-8, 
                   epsrel=1.49e-8, maxp1=50, limit=50):
    return integrate.quad(_infunc, a, b, (func, gfun, hfun, args), 
                          epsabs=epsabs, epsrel=epsrel, maxp1=maxp1, limit=limit)
like image 43
jonrsharpe Avatar answered Sep 19 '22 13:09

jonrsharpe