0

我想评估一个积分,但 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 会给出警告: IntegrationWarning:积分可能是发散的,或者是缓慢收敛的。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 是费米能级,小虚部与格林函数有关)

4

1 回答 1

0

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

于 2016-05-03T21:24:35.220 回答