如何在`scipy.integrate.dblquad`中增加函数的细分数?

时间:2014-01-03 23:58:47

标签: python scipy numerical-methods integral

我正在使用scipy.integrate.dblquad,我收到此错误:

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

我想增加此限制以查看积分是否收敛良好。 documentation指定了如何为scipy.integrate.quad执行此操作(该函数将最大迭代次数作为参数),但不是scipy.integrate.dblquad。如何增加dblquad的细分数量?

2 个答案:

答案 0 :(得分:6)

更简单的方法是使用nquad函数代替dblquad。示例代码:

from scipy.integrate import nquad

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

请注意,有几个参数是列表。这些列表的元素按顺序应用于每个坐标。请参阅nquad here的文档。

答案 1 :(得分:4)

根据source codedblquad 来电 quad,只需阅读:

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

因此,您可以使用附加的maxp1参数直接实现此操作。

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)