Python 3.x 用梯形法则计算指数积分函数

Python 3.x 用梯形法则计算指数积分函数,python-3.x,math,exponential,integral,numerical-integration,Python 3.x,Math,Exponential,Integral,Numerical Integration,我想用梯形规则数值计算指数积分函数。该函数定义为: 参考资料可用。 此功能已在某些库中可用,例如scipy.special。出于某些原因,我不想使用这些库。相反,我需要用梯形规则直接计算这个函数。我写了梯形规则,并检查它,以确保它工作良好。 然后我用它来数值计算Ei函数。不幸的是,结果是不正确的,例如,我想计算等于1.89511的Ei(1),但我编写的代码返回的是无穷大,这是错误的。代码如下: import numpy as np # Integration using Trapezoida

我想用梯形规则数值计算指数积分函数。该函数定义为:

参考资料可用。 此功能已在某些库中可用,例如scipy.special。出于某些原因,我不想使用这些库。相反,我需要用梯形规则直接计算这个函数。我写了梯形规则,并检查它,以确保它工作良好。 然后我用它来数值计算Ei函数。不幸的是,结果是不正确的,例如,我想计算等于1.89511的Ei(1),但我编写的代码返回的是无穷大,这是错误的。代码如下:

import numpy as np

# Integration using Trapezoidal rule
def trapezoidal(f, a, b, n):

    h = float(b - a) / n
    s = 0.0
    s += f(a)/2.0
    for i in range(1, n):
        s += f(a + i*h)
    s += f(b)/2.0
    return s * h

# Define integrand
def Ei(t):

    return - np.exp(-t) / t

# Define Ei(1)
A = trapezoidal(Ei, -1, np.inf, 20)

print (A)

# Checking Ei(1)
from scipy.special import expi
print (expi(1))
你知道我如何修改上面的代码以便得到正确的结果吗? 谢谢

1)不能定义以
+inf
结尾的范围并将其划分为20个部分

相反,您可以选择任意右极限并将其增大,直到差值
abs(积分(极限(i+1))-integral(极限(i))
变得可以忽略不计

(p>2)考虑零点(如果发生)的函数评价。它导致除零

若参数太接近于零,尝试将其移位一点