Я физик, который пытается смоделировать вольт-амперные характеристики соединения сверхпроводник-сверхпроводник.
Уравнение для этой модели:
Текущий (или I
в коде) значения рассчитываются путем оценки этого интеграла для заданных напряжений (или 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 или любом другом языке?
python
numpy
integral-equations
запрос
источник
источник
Ответы:
Во-первых, всегда полезно продолжить отладку проблемы и точно выяснить, откуда (какой срок, для каких параметров) происходит переполнение. Это было не ясно для меня из вопроса.
Как только вы точно знаете, в чем проблема, вы можете лучше диагностировать проблему. Например, давайте возьмем проблему переполнения. Это где-то выше 1е300, если я правильно помню.
Обратите внимание, что вы явно просите код сделать неправильный интеграл (-inf, inf), поэтому вам нужно убедиться, что интегрируемый в него код корректно ведет себя для чисел во всем этом домене! Это может помочь попытаться усечь интеграл до наименьшего возможного значения, давайте назовем егоEmax где вы физически знаете, что не ожидаете какого-либо вклада в Emax до инф.
Удачи!
источник