ki和kj是一些列离散的动量,在前面的对角化计算中,直接将本征向量系数都存下来,由于投影对角化,只需要存边缘态的特征值和特征向量
nk = 512
N = 32
k = np.linspace(0,2*pi,nk)
band = np.zeros((4*N, nk))
Ak = np.zeros((4*N,nk),dtype="complex")
for i in range(nk):
Hk0 = Hamiltonian_H0_SU4(k[i],N)
E, A = LA.eigh(Hk0)
band[:,i] = E
Ak[:,i] = A[:,N-1]
def Hamiltonian_Heff(nk,iq,Ak,U,N):
H = np.zeros((nk,nk),dtype='complex')
for j in range(nk):
j_q = (j - iq + nk)%nk
for i in range(j,nk):
i_q = (i-iq + nk)%nk
H[j,i] = -np.sum(Ak[:,i_q].conj()*Ak[:,i]*Ak[:,j_q]*Ak[:,j].conj())
H = H + H.T
for i in range(nk):
i_q = (i - iq + nk)%nk
H[i,i] = np.sum(np.power(np.absolute(Ak),2).sum(axis=1)*np.power(np.absolute(Ak[:,i_q]),2))
return U*H/N