3.3. 【例題】スピン演算子

注釈

この節は基礎事項の確認です。 必要のない人はこの節は飛ばして、多体問題(【例題】量子スピン系(ハイゼンベルグ模型)【例題】強相関電子系(ハバード模型) )に進んでください。

3.3.1. スピン演算子

量子力学の演算子を数値的に扱う練習として、ここではスピン演算子の交換関係などを計算します。

スピン1/2の演算子 \hat{S}^z の2つの固有状態をケットベクトル | \uparrow \rangle| \downarrow \rangle で表します。

\hat{S}^z | \uparrow \rangle &= \frac{\hbar}{2} | \uparrow \rangle  \\
\hat{S}^z | \downarrow \rangle &= -\frac{\hbar}{2} | \downarrow \rangle

プログラム上では、演算子を 行列表現 で表すのが便利です。 上の2つの式は、以下の2×2行列にまとめられます。

S^z =
\begin{pmatrix}
\langle \uparrow | \hat{S}^z | \uparrow \rangle & \langle \uparrow | \hat{S}^z | \downarrow \rangle \\
\langle \downarrow | \hat{S}^z | \uparrow \rangle & \langle \downarrow | \hat{S}^z | \downarrow \rangle
\end{pmatrix}
=
\frac{\hbar}{2} \begin{pmatrix}
1 & 0 \\
0 & -1
\end{pmatrix}

行列表現は基底に依存するということに注意してください。 今の場合、\hat{S}^z の固有ベクトルを基底に選んでいるために、S^z が対角行列になっています(「z軸を量子化軸に選んだ」と言う)。

量子化軸をz軸にとると、スピン演算子 S^x, S^y, S^z の表現行列は以下で与えられます。

(1)S^x = \frac{1}{2} \begin{pmatrix}
0 & 1 \\
1 & 0
\end{pmatrix},
\quad
S^y = \frac{1}{2} \begin{pmatrix}
0 & -i \\
i & 0
\end{pmatrix},
\quad
S^z = \frac{1}{2} \begin{pmatrix}
1 & 0 \\
0 & -1
\end{pmatrix}

ここで、\hbar=1 としました(無次元化)。

3.3.2. 交換関係

行列表現 (1) を使って、スピン演算子の交換関係を計算してみます。 ここでは、スピン演算子の基本的な交換関係

(2)[S^{x}, S^{y}] = i S^{z} \\
[S^{y}, S^{z}] = i S^{x} \\
[S^{z}, S^{x}] = i S^{y}

を確認してみましょう。

ソースコード spin.py

まずはスピン演算子 (1) を定義します。

10# Define Sx, Sy, Sz
11sx = np.array([[0, 1], [1, 0]]) / 2
12sy = np.array([[0, -1j], [1j, 0]]) / 2
13sz = np.array([[1, 0], [0, -1]]) / 2
14
15print("Sx =\n", sx)
16print("Sy =\n", sy)
17print("Sz =\n", sz)

次に、交換関係を計算する関数を作ります。

6def commutation(mat1, mat2):
7    return mat1 @ mat2 - mat2 @ mat1

演算子が行列表現されているので、演算子同士の積は行列積になります。行列積は @ で計算できます。

あとはこの関数を呼出して、結果を表示するだけです。

19# Commutation relation
20print("\nCommutation relations")
21print("[Sx, Sy] =\n", commutation(sx, sy))  # = i Sz
22print("[Sy, Sz] =\n", commutation(sy, sz))  # = i Sx
23print("[Sz, Sx] =\n", commutation(sz, sx))  # = i Sy

実行結果

Sx =
[[0.  0.5]
[0.5 0. ]]
Sy =
[[ 0.+0.j  -0.-0.5j]
[ 0.+0.5j  0.+0.j ]]
Sz =
[[ 0.5  0. ]
[ 0.  -0.5]]

Commutation relations
[Sx, Sy] =
[[0.+0.5j 0.+0.j ]
[0.+0.j  0.-0.5j]]
[Sy, Sz] =
[[0.+0.j  0.+0.5j]
[0.+0.5j 0.+0.j ]]
[Sz, Sx] =
[[ 0.   0.5]
[-0.5  0. ]]

スピンの行列表現 (1) と交換関係 (2) が確認できます。

実習課題

以下の関係式を確認してみてください。

[S^z, S^+] &= S^+ \\
[S^z, S^-] &= -S^- \\
\bm{S}^2 &= \frac{3}{4} \bm{1}

3.3.3. 対角化

さて、次は (1) 式の行列をx軸を量子化軸に取った表現に変換してみます。

まず、S^x 行列を対角化します。

25# Diagonalize Sx
26eigval, eigvec = np.linalg.eigh(sx)
27print("\nEigenvalues =\n", eigval)
28print("\nEigenvectors (column vectors)=\n", eigvec)

eigval が固有値、eigvec が固有ベクトルを縦ベクトルとして持つ行列です(以下、U と書きます)。

基底を変換するには、対角化で得られた行列 U を使って、行列積 S^{\prime x} = U^{\dag} S^x U を計算します(今の場合、S^{\prime x} は対角行列です)。 S^{y}, S^{z} も同じ U を使って基底変換します。

30# U = <z|x>
31#   |x> : eigenvectors of the Sx operator
32#   |z> : eigenvectors of the Sz operator
33# u = eigvec
34u = eigvec @ np.diag([-1j, 1])
35print(u)
36print(u.conj().T @ u)
37
38# Transform ops from |z> to |x>
39sx_2 = u.conj().T @ sx @ u
40sy_2 = u.conj().T @ sy @ u
41sz_2 = u.conj().T @ sz @ u
42print("\nAfter basis transform")
43print("Sx' =\n", sx_2.round(10))
44print("Sy' =\n", sy_2.round(10))
45print("Sz' =\n", sz_2.round(10))

u.conj().T は行列のエルミート共役です(複素共役+転置)。 round は指定された桁(この例では小数点以下10桁)で四捨五入をする関数です。丸め誤差を除去しています。

実行結果

Eigenvalues =
[-0.5  0.5]

Eigenvectors (column vectors)=
[[-0.70710678  0.70710678]
[ 0.70710678  0.70710678]]

After basis transform
Sx' =
[[-0.5 -0. ]
[ 0.   0.5]]
Sy' =
[[0.+0.j  0.+0.5j]
[0.-0.5j 0.-0.j ]]
Sz' =
[[-0.  -0.5]
[-0.5 -0. ]]

Sx'が対角化されていることが確認できます。 また、(1) 式と比べると、Sx'∝Sz, Sy'∝Sy, Sz'∝Sx という関係が確認できます。 したがって、変換後の基底は、x軸を量子化軸とした、左手系の基底になっているといえます。

注釈

x軸を量子化軸とした右手系の表現を得るには、どのような変換を行えばよいでしょうか。

3.3.4. 角運動量の合成

課題

S=1/2とL=1の合成