如何在Python中的scipy.integrate.quad中使用参数epsabs?

问题描述 投票:1回答:1

我试图通过为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错了吗?我该怎么做才能提高积分的精度?

python scipy precision integrate quad
1个回答
2
投票

根据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得到所需的准确度。

© www.soinside.com 2019 - 2024. All rights reserved.