Integración numérica para la curva de modelado para superconductores (Python)


9

Soy un físico que intenta modelar las características de voltaje de corriente de una unión superconductor-superconductor.

La ecuación para este modelo es:

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

Los valores de corriente ( o en el código) se calculan evaluando esta integral para los voltajes dados ( V o en el código).IIVv

He intentado esto en Python. El código se muestra a continuación.

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

Sin embargo, recibo OverflowError: math range error. ¿Alguien tiene alguna idea de cómo se puede superar esto? Disculpas por las 10**nintegrales largas. El código se ejecuta cuando se eliminan los exponenciales (devuelve 0), y aquí radica el problema.

¿Alguna idea de cómo se puede modelar esto en Python o en cualquier otro idioma?


O(1mi-45)

Respuestas:


3

Primero, siempre es bueno depurar aún más el problema y ver exactamente de dónde (qué término, para qué parámetros) proviene el desbordamiento. Esto no me quedó claro a partir de la pregunta.

Una vez que sepa con precisión cuál es el problema, puede diagnosticarlo mejor. Por ejemplo, tomemos el problema de desbordamiento. Esto está en algún lugar por encima de 1e300 si no recuerdo mal.

  1. Debería preguntarse: ¿realmente debería alcanzar un rango en el que esta variable se está elevando tanto?
  2. (X+y)/ /zX,y,zX=X/ /zy=y/ /z
  3. Si está convencido de que necesita números muy grandes para el problema, intente convertir sus ecuaciones a una forma en la que las variables fundamentales estén en el espacio de registro.

mimetrounaXmimetrounaX

¡Buena suerte!

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.