Süperiletkenler için modelleme eğrisi için sayısal entegrasyon (Python)


9

Ben süperiletken-süperiletken birleşme noktasının akım-gerilim özelliklerini modellemeye çalışan bir fizikçiyim.

Denklem bu model için geçerli:

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

Güncel (Iveya Ikodda) değerler, bu integral verilen voltajlar için değerlendirilerek hesaplanır (Vveya vkodda).

Bunu Python'da denedim. Kod aşağıda gösterilmiştir.

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

Ancak alıyorum OverflowError: math range error. Bunun nasıl aşılabileceğine dair bir fikri olan var mı? 10**nUzun integraller için özür dileriz . Üstel değerler kaldırıldığında (0 döndürür) kod çalışır ve burada sorun yatar.

Python'da veya başka bir dilde nasıl modellenebileceğine dair bir fikrin var mı?


Lütfen, jeffdk aşağıdaki cevabından bahsedildiği gibi: değerlerinizi kontrol edin -> g değerini çıkarırken -inf'den + inf'ye gider O(1e45)E meydanından! Hata ayıklama amacıyla, integralinizi tanımlayan (lambda formunu kullanmak yerine) bir işlev F tanımlamak iyi bir fikir olabilir, böylece suçluyu tanımlamak için faktörleri / terimleri / parçalarına bölebilirsiniz (bu durumda, tüm faktörleriniz dertte).
GertVdE

Yanıtlar:


3

İlk olarak, sorunu daha fazla hata ayıklamak ve taşmanın nereden geldiğini (hangi terimler için hangi terimler) tam olarak görmek her zaman iyidir. Bu sorudan bana açık değildi.

Sorunun tam olarak ne olduğunu öğrendikten sonra, sorunu daha iyi teşhis edebilirsiniz. Örneğin, taşma sorununu ele alalım. Eğer doğru hatırlıyorsam bu 1e300 üzerinde bir yerde.

  1. Kendinize 'bu değişkenin bu kadar yükseldiği bir aralığa gerçekten vurmalı mıyım' diye sormalısınız.
  2. Cevabınız 'evet, ancak başka bir terime bölünür veya iptal edilir' ise, denklemleri bu terimleri birleştirecek şekilde yeniden yazmanız gerekir. Yani, eğer hesaplıyorsanız(x+y)/z ile x,y,z büyük sayılar tanımlamayı deneyin x=x/z ve y=y/zve bu değişkenleri entegre edin. Buradaki hedefler denklemlerinizi yazmak olmalıdır, böylece her zaman benzer büyüklükteki terimleri karşılaştırırsınız.
  3. Sorun için çok büyük sayılara ihtiyacınız olduğuna ikna olduysanız, denklemlerinizi temel değişkenlerin günlük alanında olduğu bir forma dönüştürmeyi deneyin.

Koddan açıkça yanlış bir integral (-inf, inf) yapmasını istediğinizi unutmayın, bu yüzden içine yerleştirdiğiniz integralin tüm alandaki sayısallar için iyi davrandığından emin olmanız gerekir! İntegrali olabildiğince küçük bir değerde kesmeyi denemenize yardımcı olabilir.Emax, fiziksel olarak bildiğinizde, integralden herhangi bir katkı beklemediğinizi Emax inf.

İyi şanslar!

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.