How to use dblquad for double integration?
Solution 1
Reread the docstring for dblquad
. The fourth and fifth arguments must be callable (i.e. functions). You have passed in 0
and np.inf
. The functions are the lower and upper bounds of the inner integral.
There is an example in the tutorial.
Solution 2
The signature of dblquad is
integrate.dblquad(func, a, b, gfun, hfun, args=(), epsabs=1.49e-08, epsrel=1.49e-08)
gfun : callable
The lower boundary curve in y which is a function taking a single floating point argument (x) and returning a floating point result: a lambda function can be useful here.
hfun : callable
The upper boundary curve in y (same requirements as gfun
).
So you need to replace gfun and hfun to functions.
![Shashank Sawant](https://i.stack.imgur.com/EqyvZ.jpg?s=256&g=1)
Shashank Sawant
MEMS Engineer | Looking for jobs | Please connect me on my LinkedIn profile esp. if youare in the field of MEMS/Process Engineering (linkedin.com/in/sgsawant)
Updated on June 09, 2022Comments
-
Shashank Sawant about 2 years
The following example is provided on
Scipy
's reference page forintegration
.from scipy import integrate N = 5 def f(t, x): return np.exp(-x*t) / t**N integrate.nquad(f, [[1, np.inf],[0, np.inf]])
The following is the error I get from my
IPython
notebook (on cloud.sagemath.com):It is my guess that
cloud.sagemath.com
has not upgraded to the latest version ofScipy
and therefore it lacks the module fornquad
. However, all I need is integration over two variables and therefore wanted to usedblquad
which is already available on the cloud.Therefore, I modified the last line to suit the
dblquad
syntax as shown below:But it still pops up the error:
TypeError: 'int' object is not callable
. What is the error in my script? I have pasted the entire error message below:--------------------------------------------------------------------------- TypeError Traceback (most recent call last) <ipython-input-5-2d0c5cf05694> in <module>() 4 def f(t, x): 5 return np.exp(-x*t) / t**N ----> 6 integrate.dblquad(f,1, np.inf,0, np.inf) /usr/local/sage/sage-6.2.rc0/local/lib/python2.7/site-packages/scipy/integrate/quadpack.pyc in dblquad(func, a, b, gfun, hfun, args, epsabs, epsrel) 424 425 """ --> 426 return quad(_infunc,a,b,(func,gfun,hfun,args),epsabs=epsabs,epsrel=epsrel) 427 428 def _infunc2(y,x,func,qfun,rfun,more_args): /usr/local/sage/sage-6.2.rc0/local/lib/python2.7/site-packages/scipy/integrate/quadpack.pyc in quad(func, a, b, args, full_output, epsabs, epsrel, limit, points, weight, wvar, wopts, maxp1, limlst) 246 if type(args) != type(()): args = (args,) 247 if (weight is None): --> 248 retval = _quad(func,a,b,args,full_output,epsabs,epsrel,limit,points) 249 else: 250 retval = _quad_weight(func,a,b,args,full_output,epsabs,epsrel,limlst,limit,maxp1,weight,wvar,wopts) /usr/local/sage/sage-6.2.rc0/local/lib/python2.7/site-packages/scipy/integrate/quadpack.pyc in _quad(func, a, b, args, full_output, epsabs, epsrel, limit, points) 313 return _quadpack._qagse(func,a,b,args,full_output,epsabs,epsrel,limit) 314 else: --> 315 return _quadpack._qagie(func,bound,infbounds,args,full_output,epsabs,epsrel,limit) 316 else: 317 if infbounds !=0: /usr/local/sage/sage-6.2.rc0/local/lib/python2.7/site-packages/scipy/integrate/quadpack.pyc in _infunc(x, func, gfun, hfun, more_args) 371 372 def _infunc(x,func,gfun,hfun,more_args): --> 373 a = gfun(x) 374 b = hfun(x) 375 myargs = (x,) + more_args TypeError: 'int' object is not callable
Edit 1: I made a working script using the inputs from the users
Weckesser
andChen
. Just for the sake of completeness for anyone stumbling upon this question in the future.import numpy as np from scipy import integrate N=5 def f(t, x): return np.exp(-x*t) / t**N R1=integrate.dblquad(f,0, np.inf,lambda x: 1, lambda x: np.inf) print R1