Integrazione numerica per curva di modellazione per superconduttori (Python)


9

Sono un fisico che sta cercando di modellare le caratteristiche di corrente-tensione di una giunzione superconduttore-superconduttore.

L' equazione per questo modello è:

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

valori di corrente ( I o nel codice) vengono calcolati valutando questo integrale per determinate tensioni ( V o nel codice).IIVv

Ho provato questo in Python. Il codice è mostrato sotto.

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

Tuttavia, ricevo OverflowError: math range error. Qualcuno ha qualche idea su come superare questo problema? Ci scusiamo per gli 10**nintegrali lunghi. Il codice viene eseguito quando vengono rimossi gli esponenziali (restituisce 0) e qui sta il problema.

Qualche idea su come può essere modellato in Python o in qualsiasi altra lingua?


O(1e45)

Risposte:


3

Innanzitutto, è sempre utile eseguire il debug ulteriore del problema e vedere esattamente da dove (quale termine, per quali parametri) proviene l'overflow. Questo non mi era chiaro dalla domanda.

Una volta che sai esattamente qual è il problema, puoi diagnosticare meglio il problema. Ad esempio, prendiamo il problema di overflow. Questo è da qualche parte sopra 1e300 se ricordo bene.

  1. Dovresti chiederti 'dovrei davvero colpire un intervallo in cui questa variabile sta diventando così alta'?
  2. (x+y)/zx,y,zx=x/zy=y/z
  3. Se sei convinto di aver bisogno di numeri molto grandi per il problema, prova a convertire le tue equazioni in una forma in cui le variabili fondamentali si trovano nello spazio di log.

EmaxEmax

In bocca al lupo!

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.