Real Space Hamiltonian to k Space Hamiltonian
一维实空间哈密顿量
实空间哈密顿量
对于一维最理想的模型,其哈密顿量为:
若只考虑最近邻近似,考虑最简单的情况: \(\varepsilon_i = a, t_{i,i+1}=b\), 写成矩阵形式为:
很明显,该哈密顿量的解析解为:
能谱图为:
考虑 \(\varepsilon_i = a, t_{i,i+1}=b, t_{i+1,i}=c\), 写成矩阵形式为:
该哈密顿量的解析解为:
其能谱图为:
当 N 增加时,能谱图为:
\(k\) 空间哈密顿量
将上述实空间矩阵变换到 \(k\) 空间:
矩阵 \(U\) 的形式为:
这里的 \(p\) 是实空间指标,\(m\) 是 \(k\) 空间指标.
当 \(b=c\) 时, 实空间矩阵变换后的 \(k\) 空间矩阵是对角矩阵, 对角元即为本征值.
当 \(b\neq c\)时, \(k\) 空间矩阵不是对角矩阵.
a = 0, b = 2, c =3. 不难发现 k 空间矩阵并不是完全的对角矩阵.
二维实空间哈密顿量
考虑简单的二维哈密顿量
应用有限差分方法, \(k_x = -i\partial_x, k_y = -i\partial_y\), \(x,y\) 方向网格密度为 \(N_x, N_y\).
\(t_x = t_y = \frac{\hbar^2}{2ma^2}\), 实空间哈密顿量可写为
其中
将实空间哈密顿量变换到 \(k\) 空间
这里的[1]
详细参数见附件python文件, 下图为放大后的 HK 矩阵元.
参考文献
[1] Mincheol Shin. Full-quantum simulation of hole transport and band-to-band tunneling in nanowires using the kp method. J. Appl. Phys. 106, 054505 (2009).
[2] https://physics.stackexchange.com/questions/674136/numerically-transforming-hamiltonian-into-k-space
附件
一维哈密顿量, 点击查看代码
import numpy as np
import cmath
import time
from matplotlib import pyplot as plt
'''
For any complex a, b, c
[a, b, 0, 0, 0, 0, 0 ]
[c, a, b, 0, 0, 0, 0 ]
[0, c, a, b, 0, 0, 0 ]
[0, 0, c, a, b, 0, 0 ]
..
[0, 0, 0, 0, c, a, b ]
[0, 0, 0, 0, 0, c, a ]
'''
def Ham_R_space(a,b,c,N):
H = np.zeros((N,N),complex)
for j in range(N):
H[j][j] = a
if j + 1 < N:
H[j][j+1] = b
H[j+1][j] = c
# H[0][N-1] = c
# H[N-1][0] = b
return H
def Ham_k_space(a,b,c,N):
HRspace = Ham_R_space(a=a,b=b,c=c,N=N)
p = np.linspace(1,N,N)
y = np.linspace(1,N,N)
U = np.empty((N,N), complex)
for i in range(N):
U[i][:] = (2/(N+1))**0.5*np.sin(p[i]*np.pi/(N+1)*y)
Hkspace = np.dot(np.dot(U.conjugate().T,HRspace),U)
return Hkspace
def analytic_solution(a,b,c,N):
res = np.zeros(N,complex)
for i in range(N):
k = (i+1)*np.pi/(N+1)
res[i] = a + 2*cmath.sqrt(b*c)*np.cos(k)
# print('解析解\n',res)
return res
def main(a,b,c,N):
p = np.linspace(1,N,N)
HRspace = Ham_R_space(a=a,b=b,c=c,N=N)
plt.matshow(HRspace.real)
plt.colorbar()
eig_R = np.linalg.eigvals(HRspace)
# print('严格解:\n',sorted(eig_R))
Hkspace = Ham_k_space(a=a,b=b,c=c,N=N)
plt.matshow(Hkspace.real)
plt.colorbar()
eig_K = np.linalg.eigvals(Hkspace)
plt.figure()
plt.plot(np.diagonal(Hkspace).real,linewidth=7, label = 'diag(Hkspace)')
plt.plot(sorted(eig_R,reverse=True),linewidth=4, label = 'eig(HRspace)')
plt.plot(sorted(eig_K,reverse=True),linewidth=2, label = 'eig(Hkspace)')
res = analytic_solution(a=a,b=b,c=c,N=N)
# print('\n解析解:\n',sorted(res))
plt.plot(res,'.',label = 'analytical solution of HRspace')
plt.xlabel('$k$')
plt.ylabel('Energy')
plt.legend(loc='best')
plt.show()
if __name__ == '__main__':
main(a=0,b=2,c=3,N=200)
二维哈密顿量, 点击查看代码
import numpy as np
import time,cmath
from matplotlib import pyplot as plt
'''
[[A, B, 0, 0, 0, 0, 0]
[B*, A, B, 0, 0, 0, 0]
[0, B*, A, B, 0, 0, 0]
[0, 0, B*, A, B, 0, 0]
...
[0, 0, 0, 0, B*, A, B]
[0, 0, 0, 0, 0, B*, A]]
A = B =
[[x1, x2, 0, 0, 0, 0, 0] [[x4, x5, 0, 0, 0, 0, 0]
[x3, x1, x2, 0, 0, 0, 0] [x6, x4, x5, 0, 0, 0, 0]
[ 0, x3, x1, x2, 0, 0, 0] [ 0, x6, x4, x5, 0, 0, 0]
[ 0, 0, x3, x1, x2, 0, 0] [ 0, 0, x6, x4, x5, 0, 0]
... ...
[ 0, 0, 0, 0, x3, x1, x2] [ 0, 0, 0, 0, x6, x4, x5]
[ 0, 0, 0, 0, 0, x3, x1]] [ 0, 0, 0, 0, 0, x6, x4]]
'''
## 解析解为
def ham_R_space(x1,x2,x3,x4,x5,x6,Nx=4,Ny=4):
H = np.zeros((Nx*Ny,Nx*Ny),dtype="complex")
# H = [[ 0 for i in range(Nx*Ny)] for i in range(Nx*Ny)]
for i in range(Nx):
for j in range(Ny):
index = Nx*j+i
## x1
H[index][index] = x1
## x4
## (i, j) --> (i, j+1)
if j + 1 < Ny:
H[index][index+Nx] = x4
H[index+Nx][index] = x4.conjugate()
## x2 matrix
## (i, j) --> (i+1, j)
if i + 1 < Nx:
H[index][index+1] = x2
H[index+1][index] = x3
## x5
## (i, j) --> (i+1, j+1)
if i + 1 < Nx and j + 1 < Ny:
H[index][index+Nx+1] = x5
H[index+Nx+1][index] = x5.conjugate()
## x6
## (i, j) --> (i+1, j-1)
if i > 0 and j + 1 < Ny:
H[index][index+Nx-1] = x6
H[index+Nx-1][index] = x6.conjugate()
eig = np.linalg.eigvals(H)
# print('严格解:')
# print(sorted(eig))
return H
def ham_K_space(x1,x2,x3,x4,x5,x6,Nx=4,Ny=4):
HRspace = ham_R_space(x1=x1,x2=x2,x3=x3,x4=x4,x5=x5,x6=x6,Nx=Nx,Ny=Ny)
U = np.zeros((Nx*Ny,Nx*Ny),dtype="complex")
# H = [[ 0 for i in range(Nx*Ny)] for i in range(Nx*Ny)]
for p in range(Nx):
for q in range(Ny):
index1 = Nx*q+p
for i in range(Nx):
for j in range(Ny):
index2 = Nx*j+i
kx = (p+1)*np.pi/(Nx+1)
ky = (q+1)*np.pi/(Ny+1)
U[index1][index2] = 2/((Nx+1)*(Ny+1))**0.5*np.sin(kx*(i+1))*np.sin(ky*(j+1))
# test = np.dot(U.conjugate().T,U)
# print('U test: ',test)
Hkspace = np.dot(np.dot(U.conjugate().T,HRspace),U)
return Hkspace
def hamiltonian_analyze1(x1,x2,x3,x4,x5,x6,Nx=4,Ny=4):
### 该解析方法只适用于 x4, x5, x6 均为实数,且 x5 = x6
res = []
for i in range(1,Nx+1):
for j in range(1, Ny+1):
kx = i*np.pi/(Nx+1)
ky = j*np.pi/(Ny+1)
H00 = x1 + x4*np.exp(1j*ky) + x4.conjugate()*np.exp(-1j*ky)
H01 = x2 + x5*np.exp(1j*ky) + x6.conjugate()*np.exp(-1j*ky)
H10 = x3 + x6*np.exp(1j*ky) + x5.conjugate()*np.exp(-1j*ky)
tmp = H00 + 2*cmath.sqrt(H01*H10)*np.cos(kx)
res.append(tmp)
print('\n解析解:\n',sorted(np.array(res)))
def hamiltonian_analyze2(x1,x2,x3,x4,x5,x6,Nx=4,Ny=4):
### 该解析方法只适用于 x2=x3, 且 x5=x6, 且不能为 负数
### 或者在 x5 = x6 = 0 的情况下,该解析解有效!
res = []
for i in range(1,Nx+1):
for j in range(1, Ny+1):
kx = i*np.pi/(Nx+1)
ky = j*np.pi/(Ny+1)
H00 = x1 + 2*cmath.sqrt(x2*x3)*np.cos(kx)
H01 = x4 + 2*cmath.sqrt(x5*x6)*np.cos(kx)
H10 = x4.conjugate() + 2*cmath.sqrt(x5.conjugate()*x6.conjugate())*np.cos(kx)
tmp = H00 + 2*cmath.sqrt(H01*H10)*np.cos(ky)
res.append(tmp)
print('\n解析解:\n',sorted(np.array(res)))
def main():
x1 = 1
x2 = 2
x3 = 2
x4 = 1
x5 = 2
x6 = 2
H = ham_R_space(x1=x1,x2=x2,x3=x3,x4=x4,x5=x5,x6=x6,Nx=20,Ny=20)
HK = ham_K_space(x1=x1,x2=x2,x3=x3,x4=x4,x5=x5,x6=x6,Nx=20,Ny=20)
plt.matshow(HK.real)
plt.colorbar()
plt.matshow(H.real)
plt.colorbar()
# hamiltonian_analyze1(x1=x1,x2=x2,x3=x3,x4=x4,x5=x5,x6=x6,Nx=4,Ny=4)
# hamiltonian_analyze2(x1=x1,x2=x2,x3=x3,x4=x4,x5=x5,x6=x6,Nx=4,Ny=4)
plt.show()
main()
[2023/10/11] 补充
实空间哈密顿量矩阵 \(H_R\) 通过 \(U\) 矩阵变换到 \(K\) 空间哈密顿量矩阵\(H_K\), 下面这两种结果并不完全一致。
1), \(H_K = U^{\dagger}H_RU\)
通过U矩阵展开相乘得到 \(H_K\) 矩阵
2), \(H_K = k_p^2\delta_{p,p'}\)
假设网格点无限多,实空间是连续函数,然后对x积分得到的结果。
原因是,第一种情况计算出来的本征值形式为 \(2t+2t\cos(k_p)\), 第二种情况计算出来的是 \(tk_p^2\), 这两种结果只在 \(k_p\) 很小时近似成立。

浙公网安备 33010602011771号