強束縛格子模型のハミルトニアン
よくこんな感じのハミルトニアンを解きたいと思う方がいるかと思います。
$$
H
= -\sum_{i \in L} \mu c^{\dagger}_{i} c_{i}
+\sum_{i \in L-1} t\left( c^{\dagger}_{i}c_{i+1} + \mathrm{h.c.} \right)
$$
答えは、そうですね、$E_{k}=2t\cos(k)-\mu$になりますね。
こういったハミルトニアンの固有状態は行列表示したのちに、対角化することで得ることができます。
$$
H =
\begin{pmatrix}
c^{\dagger}_1 \\
c^{\dagger}_2 \\
\vdots \\
c^{\dagger}_L
\end{pmatrix}^\mathrm{T}
\begin{pmatrix}
-\mu & t & 0 & & \\
t & -\mu & t & \ddots & \\
0 & t & -\mu & \ddots & \\
& \ddots & \ddots & \ddots
\end{pmatrix}
\begin{pmatrix}
c_1 \\
c_2 \\
\vdots \\
c_L
\end{pmatrix}
= \Psi^{\dagger} H_\mathrm{lattice} \Psi
$$
格子ハミルトニアンをJuliaで作ってみよう。
ということで、この格子ハミルトニアンをJuliaで書いてみましょう。
H_lattice = (
- μ * diagm(ones(L))
+ t * diagm( 1 => ones(L-1),
-1 => ones(L-1) )
)
以上です。
解説
今回のミソはones
とdiagm
です。
ones
ones(L)
は、成分が1で埋められた配列を返してくれます。
In : ones(3)
Out: 3-element Vector{Float64}:
1.0
1.0
1.0
diagm
diagm(V)
は、与えられた1次元配列V
を対角成分とする行列を生成します。
In : V = [1,3,4]
Out: 3-element Vector{Int64}:
1
3
4
In : diagm(V)
Out: 3×3 Matrix{Int64}:
1 0 0
0 3 0
0 0 4
また、diagm(n => V)
としてn
というコマンドを用いると、対角からn
だけずれた位置に、V
を格納します。
In : diagm(2 => V)
Out: 5×5 Matrix{Int64}:
0 0 1 0 0
0 0 0 3 0
0 0 0 0 4
0 0 0 0 0
0 0 0 0 0
同時にも行けます。
In : diagm(2 => V, -2 => -V)
Out: 5×5 Matrix{Int64}:
0 0 1 0 0
0 0 0 3 0
-1 0 0 0 4
0 -3 0 0 0
0 0 -4 0 0
実際のコードでの使い方
以上までを組み合わせると、格子化するときに便利な行列を簡単に生成できるようになります。
In : diagm( ones(4))
Out: 4×4 Matrix{Float64}:
1.0 0.0 0.0 0.0
0.0 1.0 0.0 0.0
0.0 0.0 1.0 0.0
0.0 0.0 0.0 1.0
In : diagm( 1 => ones(4-1), -1 => ones(4-1))
Out: 4×4 Matrix{Float64}:
0.0 1.0 0.0 0.0
1.0 0.0 1.0 0.0
0.0 1.0 0.0 1.0
0.0 0.0 1.0 0.0
最後に
こんな感じの関数を作ってもいいかもしれないですね。
M_lattice(L,n,p) = (
if n == 0
M = diagm(ones(L))
else
M = diagm(
n => 1 * ones(L-n),
-n => p * ones(L-n)
)
end
)