Численное интегрирование для моделирования кривой для сверхпроводников (Python)

9

Я физик, который пытается смоделировать вольт-амперные характеристики соединения сверхпроводник-сверхпроводник.

Уравнение для этой модели:

I(V)=1eRnn|E|[E2Δ12]1/2|E+eV|[(E+eV)2Δ22]1/2[f(E)f(E+eV)]dE

Текущий (Iили Iв коде) значения рассчитываются путем оценки этого интеграла для заданных напряжений (Vили vв коде).

Я пытался это в Python. Код показан ниже.

from scipy import integrate
from numpy import *
import pylab as pl
import math

ec = 1.6021764*10**(-19)
r = 2500
gap = 200*10**(-6)*ec
g = (gap)**2
t = 0.04
k = 1.3806503*10**(-23)
kt = k*t

v_values = arange(0,0.001,0.00001)

I=[]
for v in v_values:
    result, error = integrate.quad (lambda E:(abs(E)/sqrt((E**2-g)))*(abs(E+ec*v)/(sqrt(((E+ec*v)**2-g))))*(math.exp(-E/kt)*(math.exp(-ec*v/kt)-1)),(-inf),(-gap*0.9-ec*v))
    I.append(result)
I = array(I)

I2=[]
for v in v_values:
    result2 = integrate.quad(lambda E:(abs(E)/sqrt((E**2-g)))*(abs(E+ec*v)/(sqrt(((E+ec*v)**2-g))))*(math.exp(-E/kt)*(math.exp(-ec*v/kt)-1)),(gap*0.9),(inf))
    I2.append(result2)
I2 = array(I2)

pl.plot(v_values,I,'-b',v_values,I2,'-r')
pl.xlabel(r'Voltage ($V$)')
pl.ylabel(r'Current ($A$)')
pl.title('Theoretical I(V) curve')
pl.grid(True)
pl.savefig('IVcurve.png')
pl.show()

Однако я получаю OverflowError: math range error. У кого-нибудь есть идеи, как это можно преодолеть? Извинения за 10**nи длинные интегралы. Код выполняется, когда экспоненты удалены (возвращает 0), и в этом заключается проблема.

Есть идеи, как это можно смоделировать в Python или любом другом языке?

запрос
источник
Пожалуйста, как упоминает Джеффдк в своем ответе ниже: проверьте свои значения -> E переходит от -inf к + inf, пока вы вычитаете значение g = O(1e45)с площади Е! А для целей отладки было бы неплохо определить функцию F, определяющую вашу подынтегральную функцию (вместо того, чтобы использовать лямбда-форму), чтобы вы могли разделить ее на ее факторы / термины / части, чтобы определить виновника (хотя в этом случае все ваши факторы в беде).
GertVdE

Ответы:

3

Во-первых, всегда полезно продолжить отладку проблемы и точно выяснить, откуда (какой срок, для каких параметров) происходит переполнение. Это было не ясно для меня из вопроса.

Как только вы точно знаете, в чем проблема, вы можете лучше диагностировать проблему. Например, давайте возьмем проблему переполнения. Это где-то выше 1е300, если я правильно помню.

  1. Вы должны спросить себя: «Должен ли я действительно достигнуть диапазона, в котором эта переменная становится такой высокой»?
  2. Если ответ «да, но он разделен или отменен другим термином», необходимо переписать уравнения таким образом, чтобы объединить эти термины. То есть, если вы рассчитываете(x+y)/z с x,y,z огромные числа пытаются определить x=x/z а также y=y/zи интегрировать эти переменные. Цели здесь должны состоять в том, чтобы написать свои уравнения так, чтобы вы всегда сравнивали схожие величины.
  3. Если вы уверены, что вам нужны очень большие числа для задачи, попробуйте преобразовать ваши уравнения в форму, в которой фундаментальные переменные находятся в лог-пространстве.

Обратите внимание, что вы явно просите код сделать неправильный интеграл (-inf, inf), поэтому вам нужно убедиться, что интегрируемый в него код корректно ведет себя для чисел во всем этом домене! Это может помочь попытаться усечь интеграл до наименьшего возможного значения, давайте назовем егоEmaxгде вы физически знаете, что не ожидаете какого-либо вклада в Emax до инф.

Удачи!

jeffdk
источник