Integração numérica para modelagem de curvas para supercondutores (Python)


9

Eu sou um físico que está tentando modelar as características de tensão de corrente de uma junção supercondutor-supercondutor.

A equação para este modelo é:

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

Os valores de corrente ( ou no código) são calculados avaliando esta integral para determinadas tensões ( V ou no código).IIVv

Eu tentei isso em Python. O código é mostrado abaixo.

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

No entanto, eu recebo OverflowError: math range error. Alguém tem alguma idéia de como isso pode ser superado? Desculpas pelas 10**nintegrais longas e. O código é executado quando os exponenciais são removidos (retorna 0) e aqui está o problema.

Alguma idéia de como isso pode ser modelado em Python ou qualquer outra linguagem?


O(1e45)

Respostas:


3

Primeiro, é sempre bom depurar ainda mais o problema e ver exatamente de onde (qual termo, para quais parâmetros) o estouro está vindo. Isso não ficou claro para mim com a pergunta.

Depois de saber exatamente qual é o problema, você poderá diagnosticar melhor o problema. Por exemplo, vamos considerar a questão do estouro. Isso está em algum lugar acima de 1e300, se bem me lembro.

  1. Você deveria estar se perguntando "eu realmente deveria estar atingindo um intervalo em que essa variável está ficando tão alta"?
  2. (x+y)/zx,y,zx=x/zy=y/z
  3. Se você está convencido de que precisa de números muito grandes para o problema, tente converter suas equações para uma forma em que as variáveis ​​fundamentais estejam no espaço de log.

EmaxEmax

Boa sorte!

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.