使用四边形提高积分精度

问题描述 投票:0回答:2
import math
from scipy.integrate import quad

def integrand(x):
    return 1/math.log(x)

for i in range(1,13):
    n = 10**i
    I = quad(integrand, 1.45137, n)
    print('Li(',n,') = ' ,I[0], '   Error bound = ', I[1], sep = "")

在评估

logarithmic integral function
时,上面的代码以足够的精度返回
n
的值,最高可达 1,000,000,然后精度会下降。对于我的要求,我希望将误差限制在远低于
1
的范围内,即使对于更大的参数,比如最大
10**12
。我尝试了
epsabs
limit
参数,对任何
n
没有任何明显的影响,并且由于这不是函数值低于浮点下限的情况,我认为不值得尝试我的运气具有多精度的恶作剧。有人有什么建议吗?

python numpy scipy
2个回答
2
投票

您可以设置误差容限:

I = quad(integrand, 1.45137, n,epsrel = 1e-012)

输出:

Li(10) = 6.165597450825269   Error bound = 1.3760057428455556e-12
Li(100) = 30.126139530117598   Error bound = 3.845093652017017e-10
Li(1000) = 177.60965593619017   Error bound = 1.0048009489777205e-08
Li(10000) = 1246.1372138454267   Error bound = 2.5251966557222983e-11
Li(100000) = 9629.808998996832   Error bound = 4.4348515334357425e-10
Li(1000000) = 78627.54915740821   Error bound = 8.356797391525394e-09
Li(100000000) = 5762209.375445976   Error bound = 1.7291372054824457e-06
Li(1000000000) = 50849234.956999734   Error bound = 1.7689864637237228e-05
Li(10000000000) = 455055614.58662117   Error bound = 0.00014576268969193965
Li(100000000000) = 4118066400.621609   Error bound = 0.0009848731833003443
Li(1000000000000) = 37607950280.804855   Error bound = 0.01345062255859375

0
投票

提高精度的另一个层面是增加限制参数,它是自适应算法中使用的子区间数量的上限。

I = integrate.quad(integrand, 0.0, 0.5, epsabs=1e-10, epsrel=1e-10, limit=10000)

如果您看到诸如

之类的警告,则增加它会很有用

IntegrationWarning:已达到最大细分数(10000)。 如果增加限制没有改善,建议分析 被积函数以确定困难。 如果一个位置 局部难度可以通过意志来确定(奇异性、不连续性) 可能会从分割时间间隔并调用积分器中获益 在子范围上。 也许应该使用专用积分器。

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