使用np.linspace()作为输入时的Nan值

时间:2018-04-18 03:44:17

标签: python numpy matrix matrix-multiplication

我试图计算通过一系列势阱传输电子的概率。当使用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()

1 个答案:

答案 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