【问题标题】:How to use dblquad for double integration?如何使用 dblquad 进行双重积分?
【发布时间】:2014-05-06 19:03:07
【问题描述】:

Scipyintegration 参考页面上提供了以下示例。

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 上)得到的错误:

我猜cloud.sagemath.com 没有升级到Scipy 的最新版本,因此它缺少nquad 的模块。但是,我只需要集成两个变量,因此想使用云上已经提供的dblquad

因此,我修改了最后一行以适应dblquad 语法,如下所示:

但是还是会弹出错误: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

【问题讨论】:

    标签: python numpy scipy ipython quad


    【解决方案1】:

    重读docstring for dblquad。第四个和第五个参数必须是可调用的(即函数)。您已通过 0np.inf。函数是内积分的上下界。

    an example in the tutorial

    【讨论】:

      【解决方案2】:

      dblquad 的签名是

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

      gfun : 可调用

      y 中的下边界曲线,它是一个函数 浮点参数 (x) 并返回浮点结果:a lambda 函数在这里很有用。

      hfun : 可调用

      y 中的上边界曲线(要求与gfun 相同)。

      所以你需要将 gfun 和 hfun 替换为函数。

      【讨论】:

        猜你喜欢
        • 2012-05-07
        • 2012-05-04
        • 1970-01-01
        • 2015-09-03
        • 2021-05-24
        • 2016-12-13
        • 2019-04-15
        • 2016-05-16
        • 2016-12-13
        相关资源
        最近更新 更多