【问题标题】:How do I use parameter epsabs in scipy.integrate.quad in Python?如何在 Python 的 scipy.integrate.quad 中使用参数 epsabs?
【发布时间】:2021-05-04 23:32:39
【问题描述】:

我试图通过为scipy.integrate.quad 指定参数epsabs 来更精确地计算积分,假设我们将函数 sin(x) / x^2 从 1e-16 集成到1.0

from scipy.integrate import quad
import numpy

integrand = lambda x: numpy.sin(x) / x ** 2
integral = quad(integrand, 1e-16, 1.0)

这给了我们

(36.760078801255595, 0.01091187908038005)

为了使结果更精确,我们通过epsabs指定绝对容错

from scipy.integrate import quad
import numpy

integrand = lambda x: numpy.sin(x) / x ** 2
integral = quad(integrand, 1e-16, 1.0, epsabs = 1e-4)

结果一模一样,误差还是0.0109那么大!我是否理解参数epsabs 错误?为了提高积分的精度,我应该做些什么不同的事情?

【问题讨论】:

    标签: python scipy precision integrate quad


    【解决方案1】:

    根据scipy手册quad functionlimit参数来指定

    自适应算法中使用的子区间数的上限。

    默认情况下limit 的值为 50。 您的代码返回警告消息

    quadpack.py:364:IntegrationWarning:最大数量 细分(50)已实现。如果增加限制产量 没有改进建议分析被积函数以 确定困难。如果一个局部困难的位置 可以确定(奇点,不连​​续性)一个人可能会 从分割区间和调用积分器中获益 子范围。也许应该使用专用的积分器。
    warnings.warn(msg, IntegrationWarning)

    您必须更改limit 参数,即:

    from scipy.integrate import quad
    import numpy
    
    integrand = lambda x: numpy.sin(x) / x ** 2
    print(quad(integrand, 1e-16, 1.0, epsabs = 1e-4, limit=100))
    

    输出:

    (36.7600787611414, 3.635057215414274e-05)

    输出中没有警告消息。细分数小于 100 且 quad 达到要求的精度。

    【讨论】:

    • 我们可以用 nquad 做类似的事情吗?
    猜你喜欢
    • 2019-11-13
    • 2011-10-13
    • 2022-09-18
    • 2023-02-05
    • 2016-02-24
    • 2021-03-23
    • 2023-03-11
    • 2015-10-22
    相关资源
    最近更新 更多