การรวมตัวเลขสำหรับเส้นโค้งการสร้างแบบจำลองสำหรับตัวนำยิ่งยวด (Python)


9

ฉันเป็นนักฟิสิกส์ที่พยายามจำลองลักษณะของแรงดันไฟฟ้าในปัจจุบันของทางแยกตัวนำยิ่งยวดและตัวนำยิ่งยวด

สมสำหรับรุ่นนี้คือ:

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

ค่าปัจจุบัน (หรือในรหัส) คำนวณโดยการประเมินอินทิกรัลสำหรับแรงดันไฟฟ้าที่กำหนด (หรือในรหัส)ผม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 หรือภาษาอื่น ๆ


กรุณาตามที่ jeffdk ระบุไว้ในคำตอบของเขาด้านล่าง: ตรวจสอบค่าของคุณ -> E ไปจาก -inf ถึง + inf ในขณะที่คุณลบค่า g = O(1อี-45)จากจัตุรัส E! และเพื่อจุดประสงค์ในการดีบั๊กมันอาจเป็นความคิดที่ดีที่จะกำหนดฟังก์ชั่น F ที่กำหนดอินทิกรัลของคุณ (แทนการใช้แบบฟอร์มแลมบ์ดา) เพื่อให้คุณสามารถแยกมันออกเป็นปัจจัย / คำศัพท์ / ชิ้นส่วนต่างๆ ปัจจัยทั้งหมดของคุณกำลังมีปัญหา)
GertVdE

คำตอบ:


3

ก่อนอื่นจะเป็นการดีที่จะแก้ไขปัญหาเพิ่มเติมและดูว่าที่ใด (คำใดสำหรับพารามิเตอร์ใด) ที่โอเวอร์โฟลมา นี่ไม่ชัดเจนสำหรับฉันจากคำถาม

เมื่อคุณทราบอย่างแม่นยำว่าปัญหาคืออะไรคุณสามารถวินิจฉัยปัญหาได้ดีขึ้น ตัวอย่างเช่นลองใช้ปัญหาการล้น นี่คือที่อื่นที่ 1e300 ถ้าฉันจำได้ถูกต้อง

  1. คุณควรถามตัวเองว่า 'ฉันควรจะเลือกช่วงที่ตัวแปรนี้มีค่าสูงหรือไม่?
  2. หากคำตอบคือ 'ใช่ แต่มันถูกแบ่งออกหรือยกเลิกโดยคำอื่น' คุณจะต้องเขียนสมการใหม่ในลักษณะที่รวมคำเหล่านั้น นั่นคือถ้าคุณกำลังคำนวณ(x+Y)/Z กับ x,Y,Z จำนวนมากลองกำหนด x'=x/Z และ Y'=Y/Zและรวมตัวแปรเหล่านั้น เป้าหมายที่นี่ควรจะเขียนสมการของคุณเพื่อที่คุณจะได้เปรียบเทียบเงื่อนไขที่มีขนาดใกล้เคียงกันเสมอ
  3. หากคุณมั่นใจว่าคุณต้องการตัวเลขจำนวนมากสำหรับปัญหาลองแปลงสมการของคุณเป็นรูปแบบที่ตัวแปรพื้นฐานอยู่ใน logspace

โปรดทราบว่าคุณกำลังขอให้รหัสทำอินทิกรัลไม่ถูกต้อง (-inf, inf) ดังนั้นคุณต้องตรวจสอบให้แน่ใจว่าอินทิกรัลและคุณใส่เข้าไปมันมีความประพฤติดีสำหรับตัวเลขตลอดทั้งโดเมน! มันอาจช่วยลองตัดทอนอินทิกรัลด้วยค่าที่น้อยที่สุดที่คุณสามารถทำได้ลองเรียกมันว่าEม.axที่ซึ่งคุณรู้ทางร่างกายว่าคุณไม่ได้คาดหวังว่าคุณจะมีส่วนร่วมกับอินทิกรัลจาก Eม.ax ไปที่ inf

โชคดี!

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.