实际上做的是求解定态的 Schrodinger 方程
H∣Ψ⟩=E∣Ψ⟩
Why ED?
这种算法对于选定的有限系统是数值精确的 (仍受浮点精度和迭代收敛误差限制), 可以作为其他算法的 benchmark. 如果得到完整的本征值和本征态, 原则上可以计算这个有限系统的全部静态/动力学性质; 只求低能谱时则不能直接获得全部信息。
但这种算法的根本困难来自于 Hilbert space 的 “exponential wall” , 计算复杂度随自由度指数增长, 对于复杂的 Hilbert space 计算是困难, 甚至是不可做到的
ED 通常只被限制到很小的系统
一种做法是做 finite size scaling, 通过逐渐计算自由度增大的相同系统, 来外推更大系统的结果
各种应用
- quantum magnets
- fermionic models
- fractional quantum Hall states
- quantum dimer models or other constrained models
- full Configuration Interaction in quantum chemistry, nuclear structure
- quantum field theory
计算尺度的例子: spin - 1/2 的某些模型可做到 N=48 的低能谱计算, 这依赖于模型、对称性和计算资源, 并不是通用上限, 也不是对整个 Hilbert 空间做全谱对角化。常见多体模型通常只能处理几十个格点。
CODE
ED 的代码结构:
- Hilbert Space: 选择一个好的基底, 考虑对称性, lookup techniques
- Hamiltonian matrix: 稀疏矩阵表示, recalculation on the fly
- Linear algebra: 调用代码库函数
- Observable: 定态性质, 动力学, 演化
on the fly 即指比起考虑存下来, 不如重新计算一遍
一种以时间换空间的方式
我们以 spin - 1/2 作为例子
考虑 4 个 spin, 一共 16 个 basis
一种储存方法是把每个态对应到一个二进制数, 再映射到十进制数, 如
∣↑↑↑↑⟩↦∣1111⟩2↦∣15⟩
bit operations
对于逐 bit 二进制数操作, 如 AND , OR, XOR, NOR
也有 bit shift, 移动数位
numpy 提供了进制数的操作抽象
由于我们用二进制数表示了系统的基底, 也可以将算符抽象为对 bit 的操作
例如: 设置第 n 个位置的 spin 为 1 (bit 从 0 开始编号)
def SetBit(i,n):
#输入态 i, 指定设置bit 位 n
#输出设置后的态
return i | (1 << n)
以及各种 bit 上的操作, 只要把基底的 spin 上下与 bit 位的 0/1 对应即可
现在我们考虑我们的系统: 取 J=1, ℏ=1, Hamiltonian 为
H=i=0∑N−1Si⋅Si+1=i=0∑N−1(SixSi+1x+SiySi+1y+SizSi+1z)=i=0∑N−1[(Si+Si+1−+Si−Si+1+)/2+SizSi+1z]
设置周期性边界条件
SN=S0
Diagonal term
在上述 Sz 乘积基底中, 对应 bit 位, 可以定义为
⟨col∣SizSi+1z∣col⟩⟨Siz⟩=⟨Siz⟩⟨Si+1z⟩=ReadBit(col,i)−0.5
Off-diagonal term
容易得到
i+1⟨0∣i⟨1∣(Si+Si+1−+Si−Si+1+)/2∣0⟩i∣1⟩i+1=0.5i+1⟨1∣i⟨0∣(Si+Si+1−+Si−Si+1+)/2∣1⟩i∣0⟩i+1=0.5
采用稀疏矩阵的储存方式: row, column, value
我们的 sample code 为 (这里改用开边界, 所以不包含首尾相连的键)
from scipy import sparse
def ReadBit(i, n):
return (i >> n) & 1
def FlipBit(i, n):
return i ^ (1 << n)
def GetHopList(Ns): #这里是开边界版本
HopList = []
for i in range(Ns-1):
HopList.append([i, i+1])
return HopList
Ns = 4
NL = 1 << Ns
HopList = GetHopList(Ns)
HI = []
HJ = []
HV = []
for i0 in range(NL):
for ih in range(len(HopList)):
Pos0 = HopList[ih][0]
Pos1 = HopList[ih][1]
if ReadBit(i0, Pos0) != ReadBit(i0, Pos1):
i1 = FlipBit(i0, Pos0)
i1 = FlipBit(i1, Pos1)
HI.append(i1)
HJ.append(i0)
HV.append(0.5)
HI.append(i0)
HJ.append(i0)
HV.append((ReadBit(i0, Pos0)-0.5)*(ReadBit(i0, Pos1)-0.5))
Hamr = sparse.coo_matrix((HV, (HI, HJ)), shape=(NL, NL)).tocsc()
Symmetries
这个 Hilbert 空间如果有对称性, 与 Hamiltonian 对易的话, Hamiltonian 矩阵块在对应对称性的基底下会有更小的分块
在这个问题里, 具有 U(1) 对称性: 总 Sz 守恒, 等价于向上 spin 数 (bit 为 1 的个数) 守恒。
不断选择各种对称性, 就能利用 Hamiltonian 分块的性质压缩计算量
Implement U(1) symmetry:
即按照向上 spin 数来划分 basis, 则 Hamiltonian 自动按对应扇区分块对角。固定 N↑ 的子空间维数为 (N↑N)。
Basis look up procedure: 把原始的基底编号映射到新的基底, 我们需要做到尽可能快
一种著名的方法为 Lin Tables
这是尝试解决在固定粒子数子空间的 lookup 方法:
考虑 6 个 spin - 1/2, 将构型分为两个部分 A,B
然后为 A,B 分别建立 lookup 表, 在选定的排序下, 将完整构型在固定粒子数子空间中的 index 写成两张表的查表值之和。
这里的查表值是专门构造的偏移量, 不能直接用两部分各自的普通编号相加; 得到的是子空间中的连续 index, 一般不等于原构型的二进制整数编号。
Fermionic systems
考虑 Hubbard model
H=−t⟨i,j⟩,σ∑(Ciσ†Cjσ+H.c.)+Ui∑ni↑ni↓ni,σ=Ci,σ†Ci,σ
这里 t 为实数, ⟨i,j⟩ 对每条无向近邻键只计一次, 因而显式加上 Hermitian conjugate。
约定反对易关系
{Ci,σ,Ci′,σ′†}=δii′δσσ′,{Ci,σ†,Ci′,σ′†}={Ci,σ,Ci′,σ′}=0
并约定态的 convention , 产生算符的顺序:
C0,↑†C2,↑†C3,↑†C1,↓†C3,↓†∣0⟩
这里使用: spin 向上在前面, 同一方向 spin 内部从小到大排
在这里, 我们使用两组二进制数来存
按照我们的 convention, 有如下结果
Ci,↑†[⋅⋅⋅0i,↑⋅⋅⋅∣0⟩]=(−1)∑k=0i−1nk,↑[⋅⋅⋅Ci,↑†⋅⋅⋅∣0⟩]Ci,↑[⋅⋅⋅Ci,↑†⋅⋅⋅∣0⟩]=(−1)∑k=0i−1nk,↑[...0i,↑⋅⋅⋅∣0⟩]Ci,↓†[⋅⋅⋅0i,↓⋅⋅⋅∣0⟩]=(−1)∑k=0i−1nk,↓+∑k=0N−1nk,↑[⋅⋅⋅Ci,↓†⋅⋅⋅∣0⟩]Ci,↓[⋅⋅⋅Ci,↓†⋅⋅⋅∣0⟩]=(−1)∑k=0i−1nk,↓+∑k=0N−1nk,↑[⋅⋅⋅0i,↓⋅⋅⋅∣0⟩]
这里 0i,σ 表示该轨道未占据, 占据轨道则显式写出对应产生算符。向已占据轨道产生粒子、或从空轨道湮灭粒子, 结果都为 0。其余符号来自将算符移到约定位置时的反对易关系。
H 也有可能产生额外的符号
[C3↓†C0↓][C0↓†C1↓†∣0⟩]=C3↓†C1↓†∣0⟩=−C1↓†C3↓†∣0⟩
Finite Temperature
于是可以计算期望值, 其中 β=1/(kBT), On=⟨ψn∣O∣ψn⟩, n 遍历所选系综内的完整能量本征基。若分对称性扇区计算, 需要合并该系综允许的所有扇区; 只保留低能态时是低温截断近似。
⟨O⟩=Tr(e−βH)Tr(e−βHO)=∑ne−βEn∑nOne−βEn
电荷密度
⟨n⟩=⟨N1i=1∑N(ni↑+ni↓)⟩=N1i=1∑N(⟨ni↑⟩+⟨ni↓⟩)
计算磁化, 设格点分成 a,b 两个子晶格
Ma(b)=i∈a(b)∑Siz=i∈a(b)∑(ni↑−ni↓)/2
均匀磁化与交替磁化
mu=N1(⟨Ma⟩+⟨Mb⟩)=2N1i=1∑N(⟨ni↑⟩−⟨ni↓⟩)ms=N1(⟨Ma⟩−⟨Mb⟩)=2N1[i∈a∑(⟨ni↑⟩−⟨ni↓⟩)−i∈b∑(⟨ni↑⟩−⟨ni↓⟩)]
磁化率
令 Mu=Ma+Mb, Ms=Ma−Mb, 扰动为 H(hu,hs)=H−huMu−hsMs, 则均匀磁化率与交错磁化率分别对对应的场求导:
χu=∂hu∂muhu=hs=0,χs=∂hs∂mshu=hs=0
这里 [H,Mu]=0, 所以均匀磁化率可以写成等时涨落:
χu=Nβ[⟨Mu2⟩−⟨Mu⟩2]
但一般 [H,Ms]=0, 交错磁化率不能直接写成 βVar(Ms)/N, 而应使用虚时关联函数:
χs=N1∫0βdτ[⟨Ms(τ)Ms(0)⟩−⟨Ms⟩2],Ms(τ)=eτHMse−τH
只有在 Ms 也与 H 对易时, 才能化为同样的等时方差公式。热平均需要允许相应磁化涨落; 只取单一固定 Sz 扇区会使 Mu 的方差为零, 不能代替未限制磁化扇区的热平衡响应。
python package
see https://scipy.org
Real time evolution
量子系统的动力学演化
iℏ∂t∂∣ψ(t)⟩=H∣ψ(t)⟩
对于不含时的 H, 我们可以使用 ED 求解定态, 给出形式解
∣ψ(t)⟩=e−iHt/ℏ∣ψ(0)⟩=n∑e−iEnt/ℏ∣ψn⟩⟨ψn∣ψ(0)⟩=n∑Cne−iEnt/ℏ∣ψn⟩
Hubbard model 的无相互作用极限 (U=0), 这里固定一个自旋分量 σ, 取 hopping 振幅为 1, 考虑单粒子波包:
H=−j∑(aj,σ†aj+1,σ+H.c.),∣ψ(t=0)⟩=Ω1j∑e−(α2/2)(j−N0)2eik0jaj,σ†∣0⟩
Non-Hermitian Hamiltonian
若 Hamiltonian 不是 Hermitian
H†=H
若 H 可对角化, 可以选取完备的 bi - orthogonal 左右本征基 (简并子空间内也需选择互为对偶的基)。若遇到不可对角化的 exceptional point, 下面的展开不再直接适用, 需要广义本征矢和 Jordan 分解。
H∣Fn⟩=ωn∣Fn⟩⟨Gn∣H=⟨Gn∣ωnorH†∣Gn⟩=ωn∗∣Gn⟩
单位算子
I=n∑⟨Gn∣Fn⟩∣Fn⟩⟨Gn∣
时间演化算子
e−iHt/ℏ=n∑⟨Gn∣Fn⟩∣Fn⟩e−iωnt/ℏ⟨Gn∣
在上述条件下可构造线性时间演化。非厄米演化通常不保持态的范数, 不能直接沿用幺正演化的概率解释。