我想评估一个积分,但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给出了错误: 提供的函数不会返回有效的浮点数。
有人知道我能在这做什么吗?我应该使用不同的集成功能吗?理论上这个积分是否应该以这种方式收敛?
(如果有人想知道问题的本质:西格玛是自我能量,积分是布里渊区域,E_F是费米水平,小虚构部分与格林函数有关)
答案 0 :(得分:0)
我想把它作为评论,但我不能。 Python只能处理实际的集成。您可以在答案中找到更多详细信息:Use scipy.integrate.quad to integrate complex numbers。