模型I-V。Python中的模型I-V
方法: 執行一個整體,作爲E的函數,其輸出電流對所使用的每個電壓值。對於一系列v_values,這是重複的。該等式可以在下面找到。
雖然在這個方程範圍內-inf
到inf
極限,極限必須被限制,以使(E + eV)的^ 2- \德爾塔^ 2> 0和E^2- \德爾塔^ 2> 0,以避免極點。 (\ Delta_1 = \ Delta_2)。因此,目前有兩個積分,其範圍從-inf
到-gap-e*v
和gap
到inf
。
然而,我的回頭率一個math range error
但我相信我已經通過上述的限制排除了麻煩ê值。錯誤的Pastie:http://pastie.org/private/o3ugxtxai8zbktyxtxuvg
道歉這個問題的模糊性。但是,任何人都可以看到明顯的錯誤或代碼濫用?
我嘗試:
from scipy import integrate
from numpy import *
import scipy as sp
import pylab as pl
import numpy as np
import math
e = 1.60217646*10**(-19)
r = 3000
gap = 400*10**(-6)*e
g = (gap)**2
t = 0.02
k = 1.3806503*10**(-23)
kt = k*t
v_values = np.arange(0,0.001,0.0001)
I=[]
for v in v_values:
val, err = integrate.quad(lambda E:(1/(e*r))*(abs(E)/np.sqrt(abs(E**2-g)))*(abs(E+e*v)/(np.sqrt(abs((E+e*v)**2-g))))*((1/(1+math.exp((E+e*v)/kt)))-(1/(1+math.exp(E/k*t)))),-inf,(-gap-e*v)*0.9)
I.append(val)
I = array(I)
I2=[]
for v in v_values:
val2, err = integrate.quad(lambda E:(1/(e*r))*(abs(E)/np.sqrt(abs(E**2-g)))*(abs(E+e*v)/(np.sqrt(abs((E+e*v)**2-g))))*((1/(1+math.exp((E+e*v)/kt)))-(1/(1+math.exp(E/k*t)))),gap*0.9,inf)
I2.append(val2)
I2 = array(I2)
I[np.isnan(I)] = 0
I[np.isnan(I2)] = 0
pl.plot(v_values,I,'-b',v_values,I2,'-b')
pl.show()
如果你在軸上有極點,難道你不想在複雜分析中做這個積分嗎?計算殘留物要容易得多。 – tacaswell 2013-02-18 18:08:37
重新調整變量的大小,以便*數值計算*不涉及真正的小浮點數,例如「k」和「e」等。純數學運算時很好,但當浮點數很小時,數值算法通常效果不佳。 – unutbu 2013-02-18 18:31:22
你在第二個玻爾茲曼項中的exp的參數的分母中丟失了大括號,或者你忘記了用'kt'代替'k * t'。此外,你正在集成'[0.9 * gap-ev,0.9 * gap]'。也許你想將它分成兩個整數:一個用'(-inf,-0.9 * gap-ev)'和一個用[[0.9 * gap,inf]')。 – 2013-02-18 19:16:39