초전도체 (Python) 모델링 곡선의 수치 적 통합


9

저는 초전도체-초전도체 접합부의 전류-전압 특성을 모델링하려고하는 물리학 자입니다.

이 모델 의 방정식 은 다음과 같습니다.

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

전류 ( 또는 코드) 값은 주어진 전압 ( 또는 코드)에 대해이 적분을 평가하여 계산됩니다 .IIVv

나는 이것을 파이썬으로 시도했다. 코드는 아래와 같습니다.

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

그러나을받습니다 OverflowError: math range error. 아무도 이것을 극복 할 수있는 아이디어가 있습니까? 10**n적분과 긴 적분에 대한 사과 . 코드는 지수가 제거 될 때 (0을 반환) 실행되며 여기에 문제가 있습니다.

파이썬이나 다른 언어로 이것을 모델링하는 방법에 대한 아이디어가 있습니까?


jeffdk가 아래의 답변에서 언급했듯이 값을 확인하십시오-> E는 제곱에서 g = 값을 빼는 동안 -inf에서 + inf로 이동합니다 ! 디버깅 목적으로 람다 형식을 사용하는 대신 정수를 정의하는 함수 F를 정의하여 요인 / 용어 / 부분으로 분할하여 범인을 식별 할 수 있습니다 (이 경우에도 모든 요인에 문제가 있습니다). O(1e45)
GertVdE

답변:


3

첫째, 항상 문제를 추가로 디버깅하고 오버플로가 발생하는 위치 (어떤 용어, 어떤 매개 변수)를 정확하게 보는 것이 좋습니다. 이것은 질문에서 명확하지 않았습니다.

문제가 무엇인지 정확하게 알고 나면 문제를 더 잘 진단 할 수 있습니다. 예를 들어, 오버플로 문제를 보자. 내가 올바르게 기억한다면 이것은 1e300 이상입니다.

  1. '이 변수가이 범위를 넘어서는 범위에 도달해야합니까?'
  2. 대답이 '그렇지만 다른 용어로 나눠 지거나 취소 된 경우'이면 해당 용어를 결합하는 방식으로 방정식을 다시 작성해야합니다. 즉, 를 계산하는 경우 큰 숫자는 및 하고 해당 변수를 통합하십시오. 여기서 목표는 방정식을 작성하여 항상 비슷한 크기의 항을 비교하는 것입니다. (x+y)/zx,y,zx=x/zy=y/z
  3. 문제에 대해 매우 큰 숫자가 필요하다고 확신하면 방정식을 기본 변수가 로그 공간에있는 형태로 변환하십시오.

코드에 부적절한 정수 (-inf, inf)를 수행하도록 명시 적으로 요청하고 있으므로 코드에 삽입하는 정수가 해당 도메인 전체의 숫자에 대해 올바르게 동작하는지 확인해야합니다! 적분을 가능한 가장 작은 값으로 자르는 것이 도움이 될 수 있습니다. 라고하면, 에서 inf 로의 적분에 대한 기여를 기대하지 않는다는 것을 물리적으로 알 수 있습니다 .EmaxEmax

행운을 빕니다!

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.