3.3. 【例題】スピン演算子¶
注釈
この節は基礎事項の確認です。 必要のない人はこの節は飛ばして、多体問題(【例題】量子スピン系(ハイゼンベルグ模型) や 【例題】強相関電子系(ハバード模型) )に進んでください。
3.3.1. スピン演算子¶
量子力学の演算子を数値的に扱う練習として、ここではスピン演算子の交換関係などを計算します。
スピン1/2の演算子 の2つの固有状態をケットベクトル
と
で表します。
プログラム上では、演算子を 行列表現 で表すのが便利です。 上の2つの式は、以下の2×2行列にまとめられます。
行列表現は基底に依存するということに注意してください。
今の場合、 の固有ベクトルを基底に選んでいるために、
が対角行列になっています(「z軸を量子化軸に選んだ」と言う)。
量子化軸をz軸にとると、スピン演算子 の表現行列は以下で与えられます。
(1)¶
ここで、 としました(無次元化)。
3.3.2. 交換関係¶
行列表現 (1) を使って、スピン演算子の交換関係を計算してみます。 ここでは、スピン演算子の基本的な交換関係
(2)¶
を確認してみましょう。
まずはスピン演算子 (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. ]]
実習課題¶
以下の関係式を確認してみてください。
3.3.3. 対角化¶
さて、次は (1) 式の行列をx軸を量子化軸に取った表現に変換してみます。
まず、 行列を対角化します。
25# Diagonalize Sx
26eigval, eigvec = np.linalg.eigh(sx)
27print("\nEigenvalues =\n", eigval)
28print("\nEigenvectors (column vectors)=\n", eigvec)
eigval
が固有値、eigvec
が固有ベクトルを縦ベクトルとして持つ行列です(以下、 と書きます)。
基底を変換するには、対角化で得られた行列 を使って、行列積
を計算します(今の場合、
は対角行列です)。
も同じ
を使って基底変換します。
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の合成