2

我试图通过指定参数epsabs来更精确地计算积分scipy.integrate.quad,比如我们正在将函数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错误吗?我应该做些什么来提高积分的精度?

4

1 回答 1

4

根据 scipy 手册quad 函数limit参数来指定

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

默认值为limit50。您的代码返回警告消息

quadpack.py:364:IntegrationWarning:已达到最大细分数(50)。如果增加限制没有改善,建议分析被积函数以确定困难。如果可以确定局部难度的位置(奇点、不连续性),则可能会从拆分区间并调用子范围上的积分器中获益。也许应该使用专用的积分器。
警告。警告(味精,集成警告)

你必须改变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获得所需的精度。

于 2018-12-21T04:57:16.193 回答