如何使用dblquad进行双重积分?

6 投票
2 回答
22459 浏览
提问于 2025-04-18 05:35

下面这个例子是在 Scipy 的参考页面上提供的,主要是关于 integration(积分)的内容。

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]])

这是我在我的 IPython 笔记本(在 cloud.sagemath.com 上)遇到的错误:

enter image description here

我猜 cloud.sagemath.com 还没有升级到最新版本的 Scipy,所以缺少 nquad 这个模块。不过,我只需要对两个变量进行积分,因此想用已经可以用的 dblquad

所以,我把最后一行改成了适合 dblquad 语法的样子,如下所示:

enter image description here

但是它还是弹出了错误:TypeError: 'int' object is not callable。我的脚本中到底出了什么问题?我把整个错误信息粘贴在下面:

---------------------------------------------------------------------------
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

编辑 1:我用用户 WeckesserChen 的输入做了一个可以运行的脚本。只是为了让将来遇到这个问题的人能更完整地了解情况。

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

2 个回答

5

dblequad的函数签名是:

integrate.dblquad(func, a, b, gfun, hfun, args=(), epsabs=1.49e-08, epsrel=1.49e-08)

gfun : 可调用对象

这是y轴的下边界曲线,它是一个函数,接受一个浮点数参数(x),并返回一个浮点数结果:在这里使用lambda函数会很方便。

hfun : 可调用对象

这是y轴的上边界曲线(和gfun有相同的要求)。

所以你需要把gfun和hfun替换成具体的函数。

6

重新阅读一下关于dblquad的文档说明。第四和第五个参数必须是可以调用的东西(也就是函数)。你传入的是0np.inf。这些函数是内层积分的下限和上限。

教程中有一个例子

撰写回答