超伝導体の曲線をモデリングするための数値積分(Python)


9

私は、超伝導体-超伝導体接合の電流-電圧特性をモデル化しようとしている物理学者です。

このモデルの方程式は次のとおりです。

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

現在の(またはコード内の)値は、この積分を特定の電圧(Vまたはコード内)について評価することによって計算されます。IVv

私はこれをPythonで試みました。コードを以下に示します。

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を返します)、ここに問題があります。

これをPythonや他の言語でモデル化する方法はありますか?


O1e45

回答:


3

まず、問題をさらにデバッグし、オーバーフローがどこから来ているか(どのパラメーターの場合は)正確に確認することは常に良いことです。これは質問から私には明確ではありませんでした。

問題が正確にわかったら、問題をより適切に診断できます。たとえば、オーバーフローの問題を考えてみましょう。私が正しく覚えていれば、これは1e300のどこかです。

  1. あなたは「この変数がこれほど高くなっている範囲に本当に私は当たるべきか」と自問する必要がありますか?
  2. バツ+y/zバツyzバツ=バツ/zy=y/z
  3. 問題に対して非常に大きな数が必要であると確信している場合は、方程式を、基本変数が対数空間にある形式に変換してみてください。

EメートルaバツEメートルaバツ

幸運を!

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.