0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

格子ハミルトニアン生成時の便利な行列

Last updated at Posted at 2024-12-17

強束縛格子模型のハミルトニアン

よくこんな感じのハミルトニアンを解きたいと思う方がいるかと思います。

$$
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)  )
)

以上です。

解説

今回のミソはonesdiagmです。

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
)
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?