Tích hợp số để mô hình hóa đường cong cho chất siêu dẫn (Python)


9

Tôi là một nhà vật lý đang cố gắng mô hình hóa các đặc tính điện áp hiện tại của một tiếp giáp siêu dẫn-siêu dẫn.

Các phương trình cho mô hình này là:

Tôi(V)= =1eRn-n-|E|[E2-Δ12]1/2|E+eV|[(E+eV)2-Δ22]1/2[f(E)-f(E+eV)]dE

Các giá trị hiện tại ( hoặc trong mã) được tính bằng cách đánh giá tích phân này cho các điện áp đã cho ( V hoặc trong mã).TôiIVv

Tôi đã thử điều này trong Python. Các mã được hiển thị dưới đây.

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

Tuy nhiên, tôi nhận được OverflowError: math range error. Có ai có bất kỳ ý tưởng làm thế nào điều này có thể được khắc phục? Xin lỗi cho các 10**ntích hợp và dài. Mã này chạy khi số mũ được loại bỏ (trả về 0) và ở đây có vấn đề.

Bất kỳ ý tưởng làm thế nào điều này có thể được mô hình hóa trong Python, hoặc bất kỳ ngôn ngữ nào khác?


Ôi(1e-45)

Câu trả lời:


3

Đầu tiên, thật tốt khi tiếp tục gỡ lỗi vấn đề và xem chính xác vị trí (thuật ngữ nào, cho tham số nào), tràn đến từ đâu. Điều này không rõ ràng với tôi từ câu hỏi.

Một khi bạn biết chính xác vấn đề là gì, bạn có thể chẩn đoán vấn đề tốt hơn. Ví dụ: hãy xử lý sự cố tràn. Đây là nơi nào đó trên 1e300 nếu tôi nhớ chính xác.

  1. Bạn nên tự hỏi mình 'tôi có nên thực sự đạt được một phạm vi mà biến này đang tăng cao không'?
  2. (x+y)/zx,y,zx'= =x/zy'= =y/z
  3. Nếu bạn tin rằng bạn cần số lượng rất lớn cho vấn đề, hãy thử chuyển đổi phương trình của bạn sang một dạng trong đó các biến cơ bản nằm trong không gian log.

EmmộtxEmmộtx

Chúc may mắn!

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.