Integrasi numerik untuk kurva pemodelan superkonduktor (Python)


9

Saya seorang ahli fisika yang mencoba memodelkan karakteristik tegangan-arus dari persimpangan superkonduktor-superkonduktor.

The Persamaan untuk model ini adalah:

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

Nilai saat ini ( atau dalam kode) dihitung dengan mengevaluasi integral ini untuk voltase yang diberikan ( , atau dalam kode).vIIVv

Saya sudah mencoba ini dengan Python. Kode ditampilkan di bawah ini.

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

Namun, saya terima OverflowError: math range error. Adakah yang tahu bagaimana ini bisa diatasi? Permintaan maaf untuk 10**ndan integral panjang. Kode berjalan ketika eksponensial dihapus (menghasilkan 0), dan di sinilah masalahnya.

Adakah ide bagaimana ini dapat dimodelkan dengan Python, atau bahasa lain?


O(1e45)

Jawaban:


3

Pertama, itu selalu baik untuk men-debug masalah lebih lanjut dan melihat dari mana (istilah apa, untuk parameter apa) melimpah. Bagi saya pertanyaan ini tidak jelas.

Setelah Anda tahu persis apa masalahnya, Anda dapat mendiagnosis masalahnya dengan lebih baik. Sebagai contoh, mari kita ambil masalah overflow. Ini adalah suatu tempat di atas 1e300 jika saya ingat dengan benar.

  1. Anda harus bertanya pada diri sendiri 'haruskah saya benar-benar memukul kisaran di mana variabel ini mendapatkan setinggi ini'?
  2. Jika jawabannya adalah 'ya, tetapi dibagi atau dibatalkan oleh istilah lain', Anda perlu menulis ulang persamaan dengan cara yang menggabungkan istilah-istilah tersebut. Yaitu, jika Anda menghitung dengan x , y , z(x+y)/zx,y,zx=x/zy=y/z
  3. Jika Anda yakin Anda membutuhkan angka yang sangat besar untuk masalah ini, coba konversi persamaan Anda ke bentuk di mana variabel fundamental berada di ruang log.

EmaxEmax

Semoga berhasil!

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.