跳至内容
自旋链的基态能量

自旋链的基态能量

在这个示例中,我们将使用密度矩阵重整化群(DMRG)模拟来研究一条具有开放边界条件的32格点自旋二分之一海森堡链的基态能量。我们将考察基态能量的收敛情况,以及截断误差随迭代次数的衰减情况。

哈密顿量是反铁磁海森堡交换模型,最早由W. Heisenberg, Zeitschrift für Physik 49, 619-636 (1928)提出:

H=Ji,jSiSj,J>0. H = J\sum_{\langle i,j \rangle} \mathbf{S}^i \cdot \mathbf{S}^j, \qquad J>0.

DMRG方法本身由S.R. White, Physical Review Letters 69, 2863-2866 (1992)提出。

参数

参数含义取值
LATTICE用于该链的晶格open chain lattice
MODEL哈密顿量所属的模型族spin
CONSERVED_QUANTUMNUMBERS基组中固定的量子数N,Sz
Sz_total总磁化强度分区0
J海森堡交换耦合1
SWEEPSDMRG扫描次数4
NUMBER_EIGENVALUES保留的低能本征态数目1
L链长32
MAXSTATES保留的DMRG基组态数目100

晶格

   J     J     J             J
o-----o-----o-----o-- ... --o     (32 个格点,开放边界条件)

一条由32个格点组成的open chain lattice——这是验证新DMRG设置是否正确收敛的标准、最简单的测试用例,之后才会用于更复杂的计算。其他内置晶格请参见ALPS晶格库

方法选择

完整的希尔伯特空间维度为2324.3×1092^{32}\approx4.3\times10^9,远超精确对角化的能力范围。采用MAXSTATES=100的DMRG方法能够以变分方式在少数几次扫描内找到基态,并且——与精确对角化不同——还能直接给出下文将要考察的逐次扫描收敛历史。

import pyalps
import numpy as np
import matplotlib.pyplot as plt
import pyalps.plot

parms = [ { 
        'LATTICE'                   : "open chain lattice", 
        'MODEL'                     : "spin",
        'CONSERVED_QUANTUMNUMBERS'  : 'N,Sz',
        'Sz_total'                  : 0,
        'J'                         : 1,
        'SWEEPS'                    : 4,
        'NUMBER_EIGENVALUES'        : 1,
        'L'                         : 32,
        'MAXSTATES'                 : 100
       } ]

input_file = pyalps.writeInputFiles('parm_spin_one_half',parms)
res = pyalps.runApplication('dmrg',input_file,writexml=True)

接下来,我们加载由DMRG代码测得的基态属性

data = pyalps.loadEigenstateMeasurements(pyalps.getResultFiles(prefix='parm_spin_one_half'))

并将其打印到终端。

for s in data[0]:
    print(s.props['observable'], ' : ', s.y[0])

此外,我们还可以加载每个迭代步骤的详细数据。

iter = pyalps.loadMeasurements(pyalps.getResultFiles(prefix='parm_spin_one_half'),
                          what=['Iteration Energy','Iteration Truncation Error'])

以上数据使我们能够观察DMRG算法是如何收敛到最终结果的。

最后,我们绘制基态能量和截断误差随迭代次数变化的收敛曲线。

plt.figure()
pyalps.plot.plot(iter[0][0])
plt.title('Iteration history of ground state energy (S=1/2)')
plt.ylim(-15,0)
plt.ylabel('$E_0$')
plt.xlabel('iteration')

plt.figure()
pyalps.plot.plot(iter[0][1])
plt.title('Iteration history of truncation error (S=1/2)')
plt.yscale('log')
plt.ylabel('error')
plt.xlabel('iteration')

plt.show()

基态能量随迭代次数变化的收敛情况如下图所示。 Ground State Energy

我们还可以观察截断误差随迭代次数增加而衰减的情况。 Truncation Error

结果

运行上述代码可得到收敛后的基态能量为

E0=13.997316E_0 = -13.997316

最终截断误差为4.4×10144.4\times10^{-14}——可以忽略不计,这表明对于该链长而言,MAXSTATES=100已经绰绰有余。

总结与展望

DMRG在少数几次扫描内就使32格点自旋1/2海森堡链的基态能量收敛到E0=13.9973E_0=-13.9973,其截断误差比问题的能量尺度低出许多数量级。

  1. 要使能量在小数点后第6位不再变化,实际需要多少次扫描?
  2. 收敛后的E0/LE_0/L与热力学极限下的精确值(每格点ln2+1/40.4431-\ln2+1/4\approx-0.4431)相比如何?
  3. 如果将MAXSTATES降低到20,截断误差会发生什么变化?