Intégration numérique pour la modélisation de la courbe des supraconducteurs (Python)

9

Je suis un physicien qui essaie de modéliser les caractéristiques courant-tension d'une jonction supraconductrice-supraconductrice.

L' équation pour ce modèle est:

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

Les valeurs de courant ( ou dans le code) sont calculées en évaluant cette intégrale pour des tensions données ( V , ou dans le code).IIVv

J'ai tenté cela en Python. Le code est illustré ci-dessous.

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

Cependant, je reçois OverflowError: math range error. Quelqu'un a-t-il des idées sur la façon de surmonter cela? Toutes mes excuses pour les 10**nintégrales longues. Le code s'exécute lorsque les exponentielles sont supprimées (renvoie 0), et c'est là que réside le problème.

Des idées sur la façon dont cela peut être modélisé en Python ou dans tout autre langage?

requete
la source
O(1e45)

Réponses:

3

Tout d'abord, il est toujours bon de déboguer davantage le problème et de voir exactement d'où (quel terme, pour quels paramètres) le débordement vient. Ce n'était pas clair pour moi à la question.

Une fois que vous savez précisément quel est le problème, vous pouvez mieux diagnostiquer le problème. Par exemple, prenons le problème de débordement. C'est quelque part au-dessus de 1e300 si je me souviens bien.

  1. Vous devriez vous demander «devrais-je vraiment atteindre une plage où cette variable devient si élevée»?
  2. (x+y)/zx,y,zx=x/zy=y/z
  3. Si vous êtes convaincu que vous avez besoin de très grands nombres pour le problème, essayez de convertir vos équations sous une forme dans laquelle les variables fondamentales sont dans l'espace de journal.

EmaxEmax

Bonne chance!

jeffdk
la source