Я хочу оценить интеграл, но python жалуется, что подынтегральная функция становится большой в какой-то момент во время интеграции.
Цель состоит в том, чтобы найти значение переменной Sigma.
Сигма является результатом интеграла, но сигма также появляется в подынтегральном выражении интеграла, и поэтому проблема решается с помощью итерации, когда вы делаете начальное предположение, затем помещаете предположение в интеграл, оцениваете интеграл, а затем результат обратно в интеграл и т.д.
a, U0, E_F и t — вещественные константы. Сигма вообще может быть мнимым числом. Затем я определяю подынтегральную функцию с помощью функции и выполняю итерацию 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 — уровень Ферми, а малая мнимая часть связана с функциями Грина)