ALPS 2 Tutorials:DMRG-02 Gaps/ja

From ALPS
Revision as of 05:52, 16 March 2012 by Kota (talk | contribs)

Jump to: navigation, search

ギャップの計算

既に述べたように、量子系のエネルギーギャップは基底状態と第一励起状態の差

\Delta = E_1 - E_0

によって求めることができます。次の2つの問題を解かなければなりません。(i)有限系での

\Delta(L) = E_1 (L) - E_0 (L)

(ii)熱力学的極限 L= \inftyへの外挿\Delta (L)です。後者の方はDMRGに特有ではありません。開放境界条件はよく使用される周期境界条件に比べて多少複雑です。

有限系でのギャップ計算

まず、第一励起状態とそのエネルギー値を得ることが必要です。DMRGは一般的に2つの手法が知られています。

  1. DMRG計算の一般的な手法は、同時に両状態を計算する方法です。しかし、二つの異なる量子状態を表現しなくてはならないような状態数が与えられると計算の正確さは幾分減少します。
  2. もう一つの方法は、ギャップ計算を二つの基底状態の計算に置き換えます。多くの量子系では、基底状態と第一励起状態は良い量子数によって異なるため、両状態をそれぞれ別のセクタの基底状態として扱うことができます。たとえば、スピン1/2鎖では、基底状態はトータルスピン0の一重項なので、磁化0のセクタでの基底状態となります。第一励起状態はトータルスピン1の三重項です。すなわち、磁化0の励起状態と、それぞれ+1,-1の磁化を持つセクタの基底状態から成り立ちます。これらのことは、すなわち、磁化セクタ+1の基底状態として計算が可能です。


では、まずスピン1/2鎖の計算をおこなってみましょう


サンプル計算:量子数なし

コマンドラインでの実行

以下の例では、スピン1/2鎖の例spin_one_half_gapです。第一励起状態のエネルギーを計算します。アルゴリズムは、空間Sz=0での基底状態と第一励起状態を対象とした密度行列を構築します。第一励起状態は3重項なので、例題では一重項ー三重項のギャップが得られます。

LATTICE="open chain lattice"
MODEL="spin"
CONSERVED_QUANTUMNUMBERS="N,Sz"
Sz_total=0
J=1
SWEEPS=4
L=32, MAXSTATES=40
NUMBER_EIGENVALUES=2

固有状態の数を定義するために、最後の行を追加しています。両状態を対象にしているので、それぞれの状態は正しく計算されます。しかし、もし100個の状態を取り扱うのなら、それは正しくありません。 基底状態のみを対象とした前回おこなったシミュレーション結果と、今回のパラメータファイルを用いたシミュレーション結果を比較してみてください。

アルゴリズムは2つの状態の電子密度計算をおこなっているので、この例での量子もつれエントロピーは無視できるレベルであることがわかります。

Pythonを使った実行

スクリプト spin_one_half_gap.pyはDMRG-01チュートリアルのスピン1/2のものと、NUMBER_EIGENVALUESと、この固有状態からのデータをロードする記述以外は同一のものです。

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,
       'L'                         : 32,
       'MAXSTATES'                 : 100,
       'NUMBER_EIGENVALUES'        : 2
      } ]
input_file = pyalps.writeInputFiles('parm_spin_one_half_gap',parms)
res = pyalps.runApplication('dmrg',input_file,writexml=True)
data = pyalps.loadEigenstateMeasurements(pyalps.getResultFiles(prefix='parm_spin_one_half_gap'))

全観測量を繰り返し計算している間に、エネルギー値を抽出します。

energies = np.empty(0)
for s in data[0]:
   if s.props['observable'] == 'Energy':
       energies = s.y
   else:
       print s.props['observable'], ':', s.y[0]

ギャップの計算をおこないます。

energies.sort()
print 'Energies:',
for e in energies:
   print e,
print '\nGap:', abs(energies[1]-energies[0])

Vistrailsを使った実行

dmrg-02-gaps.vtから、ワークフロー"spin 1/2 without quantum numbers"を選択してください。異なるMAXSTATESで2つのシミュレーションをおこない、両者のギャップをプロットします。

サンプル計算:量子数あり

量子数保存を活用した一重項-三重項ギャップの計算をおこなうために、Sz=0,Sz=1の個別の独立したシミュレーションをおこないます。この2つの状態のエネルギー差からギャップを求めます。

コマンドラインでの実行

上記のspin_one_halfファイルのfileSz_totalに次のように修正を加えます。

LATTICE="open chain lattice"
MODEL="spin"
CONSERVED_QUANTUMNUMBERS="N,Sz"
Sz_total=1
SWEEPS=4
J=1
L=32, MAXSTATES=40

このファイルはspin_one_half_tripletからダウンロードしてください。

Pythonを使った実行

二つのSzセクターを定義し、シミュレーションをおこないます。スクリプトspin_one_half_triplet.pyを参照してください。

parms = []
for sz in [0,1]:
   parms.append( { 
       'LATTICE'                   : "open chain lattice", 
       'MODEL'                     : "spin",
       'CONSERVED_QUANTUMNUMBERS'  : 'N,Sz',
       'Sz_total'                  : sz,
       'J'                         : 1,
       'SWEEPS'                    : 4,
       'NUMBER_EIGENVALUES'        : 1,
       'L'                         : 32,
       'MAXSTATES'                 : 40,
       'NUMBER_EIGENVALUES'        : 1
      } )

計算結果をロード後、両セクタでの観測値を図示し、各Sz値での基底状態エネルギーをセーブします。

energies = {}
for run in data:
   print 'S_z =', run[0].props['Sz_total']
   for s in run:
       print '\t', s.props['observable'], ':', s.y[0]
       if s.props['observable'] == 'Energy':
           sz = s.props['Sz_total']
           energies[sz] = s.y[0]

Sz=1とSz=0セクタ間のエネルギーギャップの計算をおこないます。図には'Gap:', energies[1]-energies[0]です。

Vistrailsを使った実行

ワークフロー"spin 1/2 with quantum numbers"を選択してください。ファイルはdmrg-02-gaps.vtです。


熱力学極限へのギャップの外挿

最初の試みとして、D=50,100,150とし、L=32,64,96,128でギャップ計算をおこないます。Dを固定し、1/Lに対してギャップをプロットします。小さいDではどうなるでしょうか、結果は0を通る直性ではなく、曲線が見られるでしょう。このような振る舞いはDが大きくなるとほどみられます。ここではなぜそうなるか議論します。

次に、より有意義な試みとして、L=32,64,96,128を固定し、D=50,100,150,200を変化させ、各固定長でのギャップの推定をおこないます。1/Lにたいするギャップのプロットはどうなりましたか?

ファイルspin_one_half_multipleを修正し、異なるシステムサイズ、状態数のすべての計算実行にSz=0,Sz=1を設定します。5回掃引をおこない、チュートリアルの手順に従いギャップの値を外挿します。

スピン-1/2鎖のケースでは、ギャップは非常に小さいため、外挿をおこない値を求めるのは簡単ではありません。 さらに面白い問題として、スピン-1反強磁性ハイゼンベルグ鎖のギャップを考えましょう。

理由は後で述べますが、0、1磁化セクタの定常状態ではなく1、2間のギャップ計算をおこなってください。参考のため0、1間をおこなってもいいですが、ここでは1、2間として従ってください。

上記で議論したような外挿、または非常に精度の高い計算、いずれかによって精度\Delta (L)を、仮定してください。後者を望まないのであれば、D=300L=8,16,32,48,64,96,128,192,256のシステムサイズで各5回の掃引をおこない、ギャップの計算をおこなってください。

開放端の効果として1/Lで減少するので、最初に、すでにスピン-1/2のケースでおこなったように1/Lに対して\Delta (L)をプロットしてください。

小さいLでは直線ですが、その後上方に曲線を描く様子が観測されたでしょうか?曲線の直線部分に外挿するとどのようなギャップが得られるでしょうか?過大、過小評価ですか?

また、さらに長鎖のときならどうなるでしょうか?

1/L^2に対して\Delta (L)としてギャップをプロットしてみてください。大きいLの場合は曲線はどうなりますか?ギャップを外挿して推測してみてください。

最後のプロットは次式に関してです。これは非線形σ模型によるスピン-1鎖のHaldaneの解析から求められました。低位励起(kモーメントによってラベリングできる周期境界条件)はk=\pi周りで起こり、次のエネルギーを持ちます。

E(k) = E_0 + \sqrt{\Delta^2 + c^2 (k-\pi)^2}.

For the open boundary conditions, we may approximate k-\pi by 1/L (think about a particle in a box), which gives a finite-system size gap of 開​境​界​条​件では、1/L(粒子BOXを考える)でk-\piの近似を用います。これは次の有限サイズギャップを与えます。

\Delta(L) \approx \Delta \left( 1 + \frac{c^2}{2\Delta^2 L^2} \right)

そして、漸近極限では収束は基本的に1/L^2になるべきとことがわかります。\Delta=0.41052の結果が得られましたか?


よって、磁化セクタ0、1の定常状態でのギャップは、必然的に0になります。これらの結果は当然のこととして受け入れられますが、なぜ有限ギャップが正しく、消失するギャップは間違っているのでしょうか?わかりますか? 実際、なぜスピン-1鎖が開境界条件でこのような独特な振る舞いをするのか、解析的にちゃんとした理由があります。ここでこれらの現象について学びました。ローカルな観測値を見ることによってこれらのことが理解されます。