Numerische Integration zur Modellierung der Kurve für Supraleiter (Python)

9

Ich bin ein Physiker, der versucht, die Strom-Spannungs-Eigenschaften eines Supraleiter-Supraleiter-Übergangs zu modellieren.

Die Gleichung für dieses Modell lautet:

ich(V.)=1eR.n- -n- -|E.|[E.2- -Δ12]]1/.2|E.+eV.|[(E.+eV.)2- -Δ22]]1/.2[f(E.)- -f(E.+eV.)]]dE.

Stromwerte ( oder im Code) werden berechnet, indem dieses Integral für gegebene Spannungen ( V oder im Code) ausgewertet wird .ichIV.v

Ich habe dies in Python versucht. Der Code wird unten angezeigt.

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()

Ich erhalte jedoch OverflowError: math range error. Hat jemand eine Idee, wie dies überwunden werden kann? Entschuldigung für die 10**nund langen Integrale. Der Code wird ausgeführt, wenn die Exponentiale entfernt werden (gibt 0 zurück), und hier liegt das Problem.

Irgendwelche Ideen, wie dies in Python oder einer anderen Sprache modelliert werden kann?

Abfrage
quelle
Ö(1e- -45)

Antworten:

3

Erstens ist es immer gut, das Problem weiter zu debuggen und genau zu sehen, woher (welcher Begriff, für welche Parameter) der Überlauf kommt. Dies war mir aus der Frage nicht klar.

Sobald Sie genau wissen, wo das Problem liegt, können Sie das Problem besser diagnostizieren. Nehmen wir zum Beispiel das Überlaufproblem. Dies ist irgendwo über 1e300, wenn ich mich richtig erinnere.

  1. Sie sollten sich fragen, ob ich wirklich einen Bereich erreichen soll, in dem diese Variable so hoch wird.
  2. (x+y)/.zx,y,zx=x/zy=y/z
  3. Wenn Sie überzeugt sind, dass Sie für das Problem sehr große Zahlen benötigen, konvertieren Sie Ihre Gleichungen in eine Form, in der sich die grundlegenden Variablen im Logspace befinden.

EmaxE.meinx

Viel Glück!

jeffdk
quelle