エルミート行列
共役転置して不変な正方行列、すなわち
\[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$ はエルミート行列です。
エルミート行列の固有値と固有ベクトル
エルミート行列は二つの重要な性質をもちます。
・エルミート行列の固有値は実数である。
・エルミート行列の固有ベクトルは互いに直交する。
固有値は実数であることの証明
エルミート行列 $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}H\boldsymbol{u}$ は共役転置操作に対して不変です:
\[(\boldsymbol{u}^{\dagger}H\boldsymbol{u})^{\dagger}=\boldsymbol{u}^{\dagger}H\boldsymbol{u}\tag{6}\]
すなわち、$\boldsymbol{u}^{\dagger}H\boldsymbol{u}$ は実数です。
(4) は実数 = $\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}$ をかけると
\[\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{v}=(-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 のコードを載せておきます。
# sympy_hermitian_matrix
# In[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)
# In[2]
# Hを対角化
D = expand(U.H * H * U)
display(D)
一般にエルミート行列 $H$ はユニタリ行列 $U$ によって対角化可能なので ($U^{\dagger}HU=D$)、$H=UDU^{\dagger}$ と表すことができます。
NumPy でエルミート行列を対角化する場合は、以前の記事で定義した eig_diag() にエルミート行列を渡します。
# # numpy_hermitian_matrix
# In[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() が返す対角化行列が正規化されていることを確認しておきます。
# In[2]
# Uのノルムを計算
norm_U = np.linalg.norm(U, axis=0)
print(norm_U)
# [1. 1.]
numpy.linalg.eigh()
すでに述べたように、エルミート行列の固有値は必ず実数ですが、numpy.linalg.eig() を使って固有値を求めると、誤差によって虚数部が僅かに値をもちます。
# In[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() が用意されていて、固有値を浮動小数点数型で返します。
# In[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}\]
エルミート行列の主対角成分は常に実数であったのに対して、歪エルミート行列の主対角成分は常に純虚数です。
# python_skew_hermitian_matrix
# In[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]]
歪エルミート行列の固有値は常に実数でしたが、歪エルミート行列の固有値は常に純虚数です。
# In[2]
# 歪エルミート行列の固有値
eigvals = np.linalg.eig(iH)[0]
print(eigvals)
# [-2.220e-16+1.j -3.331e-16+4.j]
[参考文献]
・ Wikipedia
・『ストラング:線形代数イントロダクション』
下記は誤植と思われますので、ご確認ください。
(5) 式の下の文章で、u†u は共役転置 → u†Hu は共役転置
(6) 式の下の文章で、u†u は実数 → u†Hu は実数
誤植ではありませんが、実数=λ x 実数より → (4) は 実数=λ x 実数となり
のほうがわかりやすいと思いました。
(10) 式の下の文章で、右から u†をかける → 右から u をかける
(17) 式で、=u†u= → =u†v=
いつもありがとうございます。m(_ _)m
直しておきました。
ChatGPTにエルミート行列について質問しました
[Q] エルミート行列はどのような時に使いますか? 高校生にも理解できるように、予備校風に教えてください。
[A] エルミート行列は、線型代数学において重要な特性を持つ行列の一種です。高校生にも分かりやすく説明すると、エルミート行列は「対称行列の複素数版」と考えることができます。対称行列は、行列の要素が対角線を中心に対称に配置されている特別な行列です。同様に、エルミート行列は、複素数の要素を持ちながら対称な性質を持つ行列と言えます。エルミート行列の重要な特性は以下の通りです。
1. 対角線上の要素は必ず実数であり、他の要素と共役な関係にあります。つまり、行列の要素を複素共役にしたものと対角線上の要素が等しいです。
2. 対角線を中心に対称な性質を持ちます。すなわち、行列の転置と元の行列が等しいです。
エルミート行列は、量子力学や信号処理などでよく使用されます。例えば、量子力学の世界では、物理的な観測値を表すオペレーターがエルミート行列として表現されます。また、信号処理では、信号の周波数スペクトルを解析するためにエルミート行列が使用されます。エルミート行列の特性により、重要な性質が保持され、さまざまな分野で利用されています。対称行列に似た性質を持ちながら、複素数の要素を考慮するため、さらに広範な応用が可能です。