【问题标题】:How can I increase the number of subdivisions for functions in `scipy.integrate.dblquad`?如何增加`scipy.integrate.dblquad`中函数的细分数量?
【发布时间】:2014-01-03 23:58:46
【问题描述】:

我正在使用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的细分数量?

【问题讨论】:

    标签: python scipy numerical-methods integral


    【解决方案1】:

    一个更简单的方法是使用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 的文档。

    【讨论】:

      【解决方案2】:

      根据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)
      

      【讨论】:

      • 您知道不涉及修改源代码的任何方法吗?
      • 我不是说修改源代码,我是说用这些参数调用quad,加上maxpl,你自己。
      • 我添加了一个示例实现
      • @jonrsharpe,您能否为当前的dblquad 编写上述实现?谢谢github.com/scipy/scipy/blob/v1.7.0/scipy/integrate/…
      猜你喜欢
      • 2021-08-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-20
      • 2021-06-17
      • 2020-03-27
      相关资源
      最近更新 更多