首页 文章

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

提问于
浏览
0

我写了一些代码来近似一个积分:

使用Python 3.7,但是一些奇怪的行为正在发生,这给了我错误的结果 . 我通过以下方式推导出公式:



然后



为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中变为负数,但我不明白为什么,因为我和n都应该是正数 . 我猜这是问题开始发生的地方 . 有谁知道为什么结果不正确,如果我的假设是正确的?我正在使用Mac OS X el Capitan 10.11.6

1 回答

  • 2

    我认为这是因为溢出错误 . 如果使用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(2) 替换_38331来更正公式 .

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

相关问题