エルミート行列

エルミート行列

エルミート行列

 共役転置 して不変な正方行列、すなわち
 
\[H=H^{\dagger}\tag{1}\]
を満たす行列 $A$ を エルミート行列、または 自己随伴行列 とよびます。要素が全て実数であるときには、エルミート行列は対称行列です。複素数空間においてもエルミート行列の主対角成分は複素共役をとって不変であるために常に実数です。たとえば、
 
\[H=\begin{bmatrix}
2&1-i\\1+i&3\end{bmatrix}\tag{2}\]
の随伴行列は
 
\[H^{\dagger}=\begin{bmatrix}
2&1-i\\1+i&3\end{bmatrix}\tag{3}\]
となるので、$H$ はエルミート行列です。
 

エルミート行列の固有値と固有ベクトル

 エルミート行列は $2$ つの重要な性質をもちます。

・エルミート行列の固有値は実数である。
・エルミート行列の固有ベクトルは互いに直交する。

固有値は実数であることの証明

 エルミート行列 $H$ の固有値を $\lambda$、固有ベクトルを $\boldsymbol{u}$ としたとき、$H\boldsymbol{u}=\lambda\boldsymbol{u}$ の両辺に左側から $\boldsymbol{u}^{\dagger}$ をかけると、
 
\[\boldsymbol{u}^{\dagger}H\boldsymbol{u}
=\lambda\boldsymbol{u}^{\dagger}\boldsymbol{u}\tag{4}\]
となります。右辺の $\boldsymbol{u}^{\dagger}\boldsymbol{u}$ は $\parallel\boldsymbol{u}\parallel^2$ なので実数です。左辺の共役転置をとると
 
\[(\boldsymbol{u}^{\dagger}H\boldsymbol{u})^{\dagger}
=\boldsymbol{u}^{\dagger}
H^{\dagger}(\boldsymbol{u}^{\dagger})^{\dagger}\tag{5}\]
 $(\boldsymbol{u}^{\dagger})^{\dagger}=\boldsymbol{u}$ であり、エルミート行列の定義より $H^{\dagger}=H$ なので、$\boldsymbol{u}^{\dagger}\boldsymbol{u}$ は共役転置操作に対して不変です:
 
\[(\boldsymbol{u}^{\dagger}H\boldsymbol{u})^{\dagger}
=\boldsymbol{u}^{\dagger}H\boldsymbol{u}\tag{6}\]
 すなわち、$\boldsymbol{u}^{\dagger}\boldsymbol{u}$ は実数です。
 実数 = $\lambda$ × 実数より、固有値 $\lambda$ も実数となります。
 

固有ベクトルが互いに直交することの証明

 エルミート行列 $H$ の固有値を $\alpha,\ \beta\ (\alpha\neq \beta)$、それぞれの固有値に対応する固有ベクトルを $\boldsymbol{u},\ \boldsymbol{v}$ とします:
 
\[\begin{align*}
&H\boldsymbol{u}=\alpha\boldsymbol{u}\tag{7}\\[6pt]
&H\boldsymbol{v}=\beta\boldsymbol{v}\tag{8}
\end{align*}\]
 (7) に左から $\boldsymbol{v}^{\dagger}$ をかけると
 
\[\boldsymbol{v}^{\dagger}H\boldsymbol{u}
=\alpha\boldsymbol{v}^{\dagger}\boldsymbol{u}\tag{9}\]
 (8) の転置共役をとると
 
\[\boldsymbol{v}^{\dagger}H^{\dagger}
=\beta\boldsymbol{v}^{\dagger}\tag{10}\]
 (10) に右から $\boldsymbol{u}^{\dagger}$ をかけると
 
\[\boldsymbol{v}^{\dagger}H^{\dagger}\boldsymbol{u}
=\beta\boldsymbol{v}^{\dagger}\boldsymbol{u}\tag{11}\]
 $H^{\dagger}=H$ なので、
 
\[\boldsymbol{v}^{\dagger}H\boldsymbol{u}
=\beta\boldsymbol{v}^{\dagger}\boldsymbol{u}\tag{12}\]
 (9) と (12) を比較すると、$\alpha\neq \beta$ より
 
\[\boldsymbol{v}^{\dagger}\boldsymbol{u}=0\tag{13}\]
となるので、$\boldsymbol{v}$ と $\boldsymbol{u}$ は直交します。■

 (2) で定義したエルミート行列
 
\[H=\begin{bmatrix}
2&1-i\\1+i&3\end{bmatrix}\tag{2}\]
について具体的に固有値と固有ベクトルを求めてみます。固有方程式
 
\[\begin{vmatrix}
2-\lambda & 1-i\\
1+i & 3-\lambda
\end{vmatrix}=0\tag{14}\]
を解くと $\lambda=1,4$ を得ます。$\boldsymbol{u}=\begin{bmatrix}x\\y\end{bmatrix}$ とおいて、$H\boldsymbol{u}=1\boldsymbol{u}$ を解くと、
 
\[\boldsymbol{u}=\begin{bmatrix}-2\\1+i\end{bmatrix}\tag{15}\]
が得られます。同様に $\boldsymbol{v}=\begin{bmatrix}x\\y\end{bmatrix}$ とおいて、$H\boldsymbol{v}=4\boldsymbol{v}$ を解くと、
 
\[\boldsymbol{v}=\begin{bmatrix}1\\1+i\end{bmatrix}\tag{16}\]
が得られます。$\boldsymbol{u}$ と $\boldsymbol{v}$ の内積をとると、
 
\[(\boldsymbol{u},\boldsymbol{v})
=\boldsymbol{u}^{\dagger}\boldsymbol{u}
=(-2)\cdot 1+(1-i)(1+i)=0\tag{17}\]
となって、確かに固有ベクトル同士は直交しています。■
 

エルミート行列の対角化

 固有ベクトル $\boldsymbol{u},\ \boldsymbol{v}$ を正規化しておきます。
 
\[\boldsymbol{u}'=
\frac{1}{\sqrt{6}}\begin{bmatrix}-2\\1+i\end{bmatrix}
,\quad \boldsymbol{v}'=
\frac{1}{\sqrt{3}}\begin{bmatrix}1\\1+i\end{bmatrix}
\tag{18}\]
 $\boldsymbol{u}',\ \boldsymbol{v}'$ を並べた行列
 
\[U=\begin{bmatrix}\boldsymbol{u}'&\boldsymbol{v}'\end{bmatrix}\tag{19}\]
は $U^{\dagger}U=I$ を満たす複素空間の 直交行列 であり、ユニタリ行列とよばれます (ユニタリ行列については次回記事で詳しく学びます)。$U^{\dagger}HU$ を計算してみると、
 
\[U^{\dagger}HU
=\begin{bmatrix}1&0\\0&4\end{bmatrix}\tag{20}\]
のように 対角化 されます。以上の手順を再現する SymPy のコードを載せておきます。

# SLA_071-1

from sympy import*

init_printing()

# エルミート行列
H = Matrix([[2, 1-I],
            [1+I, 3]])

# λ=1の固有ベクトル
u = Matrix([[-2],
            [1+I]])

# λ=4の固有ベクトル
v = Matrix([[1],
            [1+I]])

# u,vを正規化
u = u.normalized()
v = v.normalized()

# uとvを列方向に連結
U = u.col_insert(1, v)

display(U)
\[\left[\begin{matrix}- \frac{\sqrt{6}}{3} & \frac{\sqrt{3}}{3}\\\frac{\sqrt{6} \left(1 + i\right)}{6} & \frac{\sqrt{3} \left(1 + i\right)}{3}\end{matrix}\right]\]
# SLA_071-2

# Hを対角化
D = expand(U.H * H * U)

display(D)
\[\left[\begin{matrix}1 & 0\\0 & 4\end{matrix}\right]\]

 一般にエルミート行列 $H$ はユニタリ行列 $U$ によって対角化可能なので ($U^{\dagger}HU=D$)、$H=UDU^{\dagger}$ と表すことができます。

 NumPy でエルミート行列を対角化する場合は、以前の記事で定義した eig_diag() にエルミート行列を渡します。

# SLA_072-1

import numpy as np
np.set_printoptions(precision=3)

# 対角化関数
def eig_diag(x):
    eig = np.linalg.eig(x)
    e = np.diag(eig[0])
    p = eig[1]
    return e, p

# エルミート行列を定義
H = np.array([[2, 1-1j],
              [1+1j, 3]])

# 対角化行列と固有値行列
D, U = eig_diag(H)

print("固有値行列 D:\n{}\n".format(D))
print("ユニタリ行列 U:\n{}".format(U))
固有値行列 D:
[[1.-2.527e-16j 0.+0.000e+00j]
 [0.+0.000e+00j 4.-1.914e-16j]]

ユニタリ行列 U:
[[ 0.816+0.j     0.408-0.408j]
 [-0.408-0.408j  0.816+0.j   ]]

 eig_diag() が返す対角化行列が正規化されていることを確認しておきます。

# SLA_072-2

# Uのノルムを計算
norm_U = np.linalg.norm(U, axis=0)

print(norm_U)
[1. 1.]

 

numpy.linalg.eigh()

 すでに述べたように、エルミート行列の固有値は必ず実数ですが、numpy.linalg.eig() を使って固有値を求めると、誤差によって虚数部が僅かに値をもちます。

# SLA_072-3

# Uの固有値と固有ベクトル
eigvals, eigvector = np.linalg.eig(H)

print("Hの固有値:\n{}\n".format(eigvals))
print("Hの固有ベクトル:\n{}".format(eigvector))
Hの固有値:
[1.-2.527e-16j 4.-1.914e-16j]

Hの固有ベクトル:
[[ 0.816+0.j     0.408-0.408j]
 [-0.408-0.408j  0.816+0.j   ]]

 NumPy にはエルミート行列専用の固有値・固有ベクトルを求める numpy.linalg.eigh() が用意されていて、固有値を浮動小数点数型で返します。

# SLA_072-4

# Uの固有値と固有ベクトル
eigvals, eigvector = np.linalg.eigh(H)

print("Hの固有値:\n{}\n".format(eigvals))
print("Hの固有ベクトル:\n{}".format(eigvector))
Hの固有値:
[1. 4.]

Hの固有ベクトル:
[[-0.816-0.j    -0.577+0.j   ]
 [ 0.408+0.408j -0.577-0.577j]]

 scipy.linalg.eigh() も同様の機能をもちます。
 

歪エルミート行列

 歪エルミート行列 (反エルミート行列) は
 
\[A^{\dagger}=-A\]
という性質を満たす行列として定義されます。$H$ がエルミート行列であるとき、$iH$ は歪エルミート行列です:
 
\[(iH)^{\dagger}=-iH^{\dagger}\tag{21}\]
 たとえば、(2) で定義したエルミート行列
 
\[H=\begin{bmatrix}
2&1-i\\1+i&3\end{bmatrix}\tag{2}\]
に純虚数 $i$ を乗じた行列は歪エルミート行列となります。
 
\[iH=\begin{bmatrix}
2i&1+i\\-1+i&3i\end{bmatrix}\tag{22}\]
 エルミート行列の主対角成分は常に実数であったのに対して、歪エルミート行列の主対角成分は常に純虚数です。

# SLA_074-1

import numpy as np
np.set_printoptions(precision=3)

# エルミート行列
H = np.array([[2, 1-1j],
              [1+1j, 3]])

# 歪エルミート行列
iH = 1j * H

print(iH)
[[ 0.+2.j  1.+1.j]
 [-1.+1.j  0.+3.j]]

 
 歪エルミート行列の固有値は常に実数でしたが、歪エルミート行列の固有値は常に純虚数です。

# SLA_074-2

# 歪エルミート行列の固有値
eigvals = np.linalg.eig(iH)[0]

print(eigvals)
[-2.220e-16+1.j -3.331e-16+4.j]

[参考文献]
・ Wikipedia
・『ストラング:線形代数イントロダクション』