投影嚴格對角化計算過程修正

2021-10-19 08:19:02 字數 3653 閱讀 7128

匯入標頭檔案

import numpy as np

import numpy.matlib

from scipy.linalg import block_diag

from numpy import linalg as la

import matplotlib.pyplot as plt

from math import sqrt,pi

生成分塊三對角矩陣函式

# 生成塊三對角矩陣函式

def tridiag(c, u, d, n):

# c, u, d are center, upper and lower blocks, repeat n times

cc = block_diag(*([c]*n))

shift = c.shape[1]

uu = block_diag(*([u]*n))

uu = np.hstack((np.zeros((uu.shape[0], shift)), uu[:,:-shift]))

dd = block_diag(*([d]*n))

dd = np.hstack((dd[:,shift:],np.zeros((uu.shape[0], shift))))

return cc+uu+dd

h0

def hamiltonian_h0_su4(k,n,t=-1):

"""t 是最近鄰hopping係數

k 是bloch波向量

n 是寬度

"""a = np.matrix([[sqrt(3),0,1,np.exp(-1j*k)],[0, sqrt(3),1,1],[1,1,sqrt(3),0],[np.exp(1j*k),1,0,sqrt(3)]])

b = np.matrix([[0,0,0,0],[0,0,0,0],[1,0,0,0],[0,-1,0,0]])

h = tridiag(a,b,b.h,n)

h[0,0] = 1000

return h

計算能帶

nk = 256

n = 256

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]

畫圖

for i in range(4*n):

plt.plot(k,band[i,:])

plt.ylim((-1,1))

實空間做如下截斷 

ak = ak[:16,:]
構造有效heff

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(nk):

i_q = (i-iq + nk)%nk

h[j,i] -= np.sum(ak[:,i_q].conj()*ak[:,i]*ak[:,j_q]*ak[:,j].conj())

m = h.copy()

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]),2))

return h/n, m/n

對角化激發態有效哈密頓量

u = 1.0

band_mag = np.zeros((nk, nk))

band_m = np.zeros((nk,nk))

psi = np.zeros((nk,nk,nk),dtype='complex')

psi_m = np.zeros((nk,nk,nk),dtype='complex')

for i in range(nk):

heff,m = hamiltonian_heff(nk,i,ak,u,n)

e, a = la.eigh(heff)

em, am = la.eigh(m)

psi[:,:,i] = a

band_mag[:,i] = e

band_m[:,i] = em

psi_m[:,:,i] = am

畫圖

for i in range(nk):

plt.plot(k,band_mag[i,:],color='gray')

#plt.ylim((0,0.1))

畫圖

for i in range(2):

plt.plot(k,band_m[i,:],color='gray')

矩陣移位操作

def circshift(matrix,shiftnum1,shiftnum2):

""""""

h,w=matrix.shape

matrix=np.vstack((matrix[(h-shiftnum1):,:],matrix[:(h-shiftnum1),:]))

matrix=np.hstack((matrix[:,(w-shiftnum2):],matrix[:,:(w-shiftnum2)]))

return matrix

計算激發譜

delta = 0.002

nw = 128

w = np.linspace(0,0.05,nw)

spectral_a = np.zeros((nw,nk),dtype='complex')

for i in range(nk):

a_kq = circshift(ak,0,i)

s_plus = np.sum(ak.conj()*a_kq,axis=0).reshape(nk,1)

for j in range(nw):

for p in range(nk):

spectral_a[j,i] += np.absolute(np.dot(psi_m[:,0,i].t,psi[:,p,i]))**2/(w[j]-band_mag[p,i]+1j*delta)

畫圖

x,y = np.meshgrid(k,w)

plt.figure(figsize=(5,5))

plt.pcolormesh(x, y, -spectral_a.imag/pi)

plt.colorbar()

#plt.yscale("log")

#plt.ylim(0.02, 0.05)

python矩陣對角化 大矩陣對角化python

我使用scipy中的linalg來得到155x156矩陣的e值和特徵向量。然而,與矩陣相比,特徵值的階數似乎是隨機的。我希望第乙個特徵值對應於矩陣中的第乙個數。請看下面我的例行程式。我首先讀取的是乙個包含所有浮點數的檔案 1u1o.dat 2533297.650278 2373859.531153 ...

對角化求可逆矩陣 矩陣對角化方法

矩陣對角化方法 摘要 本文給出了一種不同於傳統方法的矩陣對角化方法,利用矩陣的初等變換,先求出矩陣的特徵根與特徵向 量,接著再判斷矩陣是否可對角化。矩陣特徵根 特徵向量 對角化the methods of the diagonalization of the matrix gabstract in ...

相合以及對角化

介紹相合的定義以及其引出的標準型.定義 1 設給定 a,b in m n 如果存在乙個非奇異的矩陣 s 使得 a b sas 那麼就說 b 與 a 是 相合的 也稱為星相合的或者共軛相合的 b b sas t 那麼就說 b 與 a 是相合的,或者 t 相合的 也稱為 t 相合的 乙個矩陣乘以非奇異矩...