我试图通过为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
错了吗?我该怎么做才能提高积分的精度?
根据scipy手册quad function有limit
参数指定
自适应算法中使用的子间隔数的上限。
默认情况下,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
得到所需的准确度。