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

Dan*_*Dan 9 python integral scipy numerical-methods

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

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

我想增加这个限制,看看积分是否融合良好.该文档指定了如何执行此操作scipy.integrate.quad(该函数将最大迭代次数作为参数),但不是scipy.integrate.dblquad.如何增加细分数量dblquad

Dan*_*Dan 6

更简单的方法是使用nquad函数而不是dblquad.示例代码:

from scipy.integrate import nquad

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

请注意,有几个参数是列表.这些列表的元素按顺序应用于每个坐标.请在此处查看nquad的文档.


jon*_*rpe 5

根据该源代码dblquad 电话 quad,阅读,简单地说:

return quad(_infunc,a,b,(func,gfun,hfun,args),epsabs=epsabs,epsrel=epsrel)
Run Code Online (Sandbox Code Playgroud)

因此,您可以自己使用附加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)
Run Code Online (Sandbox Code Playgroud)

  • 我的意思不是修改源代码,我的意思是用这些参数调用`quad`,加上`maxpl`,你自己。 (2认同)