我试图计算通过一系列势阱传输电子的概率。当使用np.linspace()循环遍历能量值时,对于15以下的任何值,我得到一个nan的返回值。我理解这个值为0和15,因为它们在k和q值的分母中返回零值。如果我只是简单地调用getT(5),我会得到一个真正的价值。但是当使用np.linspace(0,30,2001)从循环调用getT(5)时,它返回nan。在两种情况下都不能返回nan或值?
import numpy as np
import matplotlib.pyplot as plt
def getT(Ein):
#constants
hbar=1.055e-34 #J-s
m=9.109e-31 #mass of electron kg
N=10 #number of cells
a=1e-10 #meters
b=2e-10 #meters
#convert energy and potential to Joules
conv_J=1.602e-19
E_eV=Ein
V_eV=15
E=conv_J*E_eV
V=conv_J*V_eV
#calculate values for k and q
k=(2*m*E/hbar**2)**.5
q=(2*m*(E-V)/hbar**2)**.5
#create M1, M2 Matrices
M1=np.matrix([[((q+k)/(2*q))*np.exp(1j*k*b),((q-k)/(2*q))*np.exp(-1j*k*b)], \
[((q-k)/(2*q))*np.exp(1j*k*b),((q+k)/(2*q))*np.exp(-1j*k*b)]])
M2=np.matrix([[((q+k)/(2*k))*np.exp(1j*q*a),((k-q)/(2*k))*np.exp(-1j*q*a)], \
[((k-q)/(2*k))*np.exp(1j*q*a),((q+k)/(2*k))*np.exp(-1j*q*a)]])
#calculate M_Cell
M_Cell=M1*M2
#calculate M for N cells
M=M_Cell**N
#get items in M_Cell
M11=M.item(0,0)
M12=M.item(0,1)
M21=M.item(1,0)
M22=M.item(1,1)
#calculate r and t values
r=-M21/M22
t=M11-M12*M21/M22
#calculate final T value
T=abs(t)**2
return Ein,T
#create empty array for data to plot
data=[]
#Calculate T for 500 values of E in between 0 and 30 eV
for i in np.linspace(0,30,2001):
data.append(getT(i))
data=np.transpose(data)
#generate plot
fig, (ax1)=plt.subplots(1)
ax1.set_xlim([0,30])
ax1.set_xlabel('Energy (eV)',fontsize=32)
ax1.set_ylabel('T',fontsize=32)
ax1.grid()
plt.tick_params(labelsize=32)
plt.plot(data[0],data[1],lw=6)
plt.draw()
plt.show()
答案 0 :(得分:1)
我认为差异来自行
q=(2*m*(E-V)/hbar**2)**.5
当使用介于0和15之间的单个值进行测试时,您基本上采用负数的根(因为E-V
为负数),这是不合理的,例如:
(-2)**0.5
>> (8.659560562354934e-17+1.4142135623730951j)
但是在使用np.linspace
时,你会使用负值取NumPy数组的根,这会产生nan
(以及警告):
np.array(-2)**0.5
>> RuntimeWarning: invalid value encountered in power
>> nan