评估 Python 3.7 中的积分;奇怪的行为

Evaluating integrals in Python 3.7; strange behaviour

我写了一些代码来近似积分: 使用 Python 3.7,但是发生了一些奇怪的行为,这给了我错误的结果。我通过以下方式推导出公式:

然后 for n = 1,2,3...

这在我的代码中实现了:

import numpy as np

I = 1
for n in range(1,21):
    I = 2*(np.log(2))**n - n*I

这应该导致 I = 0.0000419426270488826,但我的代码给出了 50.40429353428721。我一直在尝试使用 print 语句弄清楚发生了什么:

print("Iteration: ",n)
print("first half: ",2*(np.log(2))**n)
print("second half: ", n*I)
print("New I: ",I, "\n")

你可以看到等式的后半部分在第17次迭代中变成了负数,但我不明白为什么,因为I和n应该都是正数。我的猜测是这就是问题开始出现的地方。有谁知道为什么结果不正确,以及我的假设是否正确?我正在使用 Mac OS X el Capitan 10.11.6

我认为是因为溢出错误。 如果使用 Decimal 提高浮点精度,问题就会解决。 这是代码:

import numpy as np
from decimal import *
getcontext()

n = 20
print('n=',n)
def In(n):
    if n==0:
        return 1
    else:
        return 2*Decimal(2).ln()**n - n*In(n-1)

print('I{}={}'.format(n,float(In(n))))

# check with an existing function of Scipy
import scipy.integrate as integrate
result = integrate.quad(lambda x: np.log(x)**n, 1, 2)
print('I{}={}'.format(n,result))

这是输出:

n= 20
I20=4.1942535120159466e-05
I20=(4.1942627048882645e-05, 7.29235597161084e-18)

顺便说一句,需要更正公式,将ln(x)替换为ln(2)

更新:问题的名称可能是 loss of significance