评估 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
我写了一些代码来近似积分: 使用 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