【问题标题】:Evaluate integral with convergence problems.用收敛问题评估积分。
【发布时间】:2016-04-20 15:06:22
【问题描述】:

我想计算一个积分,但 python 抱怨积分在积分过程中的某个时间点变大了。

目标是找到一个名为 Sigma 的变量的值。

Sigma 是积分的结果,但 Sigma 也出现在积分的被积函数中,因此问题通过迭代解决,您先进行初始猜测,然后将猜测放入积分,评估积分,然后但结果回到积分等。

a、U0、E_F 和 t 是实常数。 Sigma 通常可以是一个虚数。然后我用一个函数定义被积函数并迭代 100 次。

我的代码如下:

a = 1
U0 = 0.001
E_F = 0.10
t = taa/(a**2)
Sigma = 0
def integrand(k_x,a, U0, E_F, t,Sigma):   
    return a*U0**2/(24*np.pi) * 1/(E_F - 2*t*(1-np.cos(a*k_x))-Sigma)
Sigma = quad(integrand,-np.pi/a,np.pi/a, args=(a,U0,E_F,t,Sigma))
for i in range(0,100):
    Sigma = quad(integrand,-np.pi/a,np.pi/a, args=(a,U0,E_F,t,Sigma[0]))

(taa 在其他地方指定,但它只是一个实常数)。

运行代码时,Python 会给出警告: 积分警告:积分可能是发散的,或缓慢收敛的。 Python 确实给出了答案,但错误值大约是答案值的两倍。

我应该在被积函数 epsilon*i 上添加一个小的虚部,这应该确保积分收敛。

当你有一个真正的积分时,你有一个复数的积分是否无关紧要?

我尝试将代码调整为:

a = 1
U0 = 0.001
E_F = 0.10
t = taa/(a**2)
Sigma = 0
epsilon = 0.01*1j
def integrand(k_x,a, U0, E_F, t,epsilon,Sigma):   
    return a*U0**2/(24*np.pi) * 1/(E_F +epsilon - 2*t*(1-np.cos(a*k_x))-Sigma)
Sigma = quad(integrand,-np.pi/a,np.pi/a, args=(a,U0,E_F,t,epsilon,Sigma))
for i in range(0,100):
    Sigma = quad(integrand,-np.pi/a,np.pi/a, args=(a,U0,E_F,t,epsilon,Sigma[0]))

我认为这样积分应该收敛,但是 Python 给出了错误: 提供的函数没有返回有效的浮点数。

有人知道我可以在这里做什么吗?我应该使用不同的集成功能吗?这个积分理论上应该这样收敛吗?

(如果有人想知道问题的本质:Sigma 是自能,积分在布里渊区,E_F 是费米能级,小虚部与格林函数有关)

【问题讨论】:

    标签: python-3.x integral convergence


    【解决方案1】:

    我想把它作为评论,但我不能。 Python 只能处理真正的被积函数。您可以在此处的答案中找到更多详细信息:Use scipy.integrate.quad to integrate complex numbers

    【讨论】:

      猜你喜欢
      • 2021-03-02
      • 2014-09-02
      • 1970-01-01
      • 1970-01-01
      • 2017-12-22
      • 2011-07-20
      • 1970-01-01
      • 1970-01-01
      • 2021-09-24
      相关资源
      最近更新 更多