Вычислите интеграл с проблемами сходимости.

Я хочу оценить интеграл, но 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 — уровень Ферми, а малая мнимая часть связана с функциями Грина)


person Marnix    schedule 20.04.2016    source источник


Ответы (1)


Я хотел бы оставить это просто как комментарий, но я не могу. Python может обрабатывать только реальные интегранты. Вы можете найти более подробную информацию в ответах здесь: Используйте scipy.integrate.quad для интегрирования комплексных чисел.

person wikiwert    schedule 03.05.2016