共役転置と随伴行列
今回からベクトルおよび行列の要素を複素数に拡張します。$n$ 次元複素数空間は complex number の頭文字をとって $\mathbb{C}^n$ と表されます。内積 や ノルム、転置行列 などが、実空間 $\mathbb{R}^n$ における定義を包含するような形で再定義され、エルミート行列やユニタリ行列などの新しい種類の行列が登場します。
随伴行列
実数空間では、行列の転置とは各要素を主対角成分について折り返すだけでした。しかし複素数の線型代数においては、一般に 共役転置、すなわち各要素の複素共役をとって転置する操作が重要な意味をもちます。行列 $A$ を共役転置して得られる行列を $A^{\dagger},\ A^H,\ A^*$ などの記号で表し、$A$ の 随伴行列 (adjoint matrix) とよびます。
数学では $*$ が用いられることが普通ですが、$*$ は単に複素共役をとる意味で使われることもあって紛らわしいので、このサイトでは物理や工学の分野で広く用いられる $\dagger$ (ダガー) の記号を採用します。たとえば、
\[A=\begin{bmatrix}1&1+i\\1-i&i\end{bmatrix}\tag{1}\]
の随伴行列は
\[A^{\dagger}=\begin{bmatrix}1&1+i\\1-i&-i\end{bmatrix}\tag{2}\]
で与えられます。NumPy で共役転置関数 hermitian() を実装しておきましょう。配列オブジェクト arr の転置は arr.T で、複素共役は np.cunjugate(arr) で取得できます。
# python_adjoint_matrix
# In[1]
import numpy as np
from scipy import linalg
def hermitian(arr):
return np.conjugate(arr.T)
(1) で定義した $A$ の随伴行列を求めてみます。
# In[2]
# 行列を定義
A = np.array([[1, 1 + 1j],
[1 - 1j, 1j]])
# Aの随伴行列
A_h = hermitian(A)
print(A_h)
# [[1.-0.j 1.+1.j]
# [1.-1.j 0.-1.j]]
任意のサイズの $A$ について以下の基本性質が成り立ちます。
\[\begin{align*}&(A^{\dagger}) ^{\dagger}=A\tag{3}\\[6pt]&(A+B) ^{\dagger}=A^{\dagger}+B^{\dagger}\tag{4}\\[6pt]&(AB)^{\dagger}=B^{\dagger} A^{\dagger}\tag{5}\end{align*}\]
行列 $A$ が正方行列であるときには、
\[\begin{align*}&\det A^{\dagger}=\overline{\det A}\tag{6}\\[6pt]&\mathrm{tr}(A^{\dagger})=\overline{\mathrm{tr}A}\tag{7}\end{align*}\]
が成立します。行列 $A$ が正則であるときは、随伴行列 $A^{\dagger}$ も正則であって、
\[(A^{\dagger})^{-1}=(A^{-1})^{\dagger}\tag{8}\]
が成り立ちます。
# In[3]
# 複素行列を定義
A = np.array([[1 + 2j, 1 - 1j],
[2 + 3j, 2 + 1j]])
# Aの随伴行列の逆行列
B = linalg.inv(hermitian(A))
# Aの逆行列の随伴行列
C = hermitian(linalg.inv(A))
print("Aの随伴行列の逆行列:\n{}\n".format(B))
print("Aの逆行列の随伴行列:\n{}".format(C))
# Aの随伴行列の逆行列:
# [[-0.146+0.317j -0.049-0.561j]
# [ 0.22 +0.024j 0.073+0.341j]]
# Aの逆行列の随伴行列:
# [[-0.146+0.317j -0.049-0.561j]
# [ 0.22 +0.024j 0.073+0.341j]]
複素内積
複素ベクトル $\boldsymbol{v},\ \boldsymbol{w}$ の内積 $(\boldsymbol{v},\boldsymbol{w})$ は $\boldsymbol{v}$ の共役転置ベクトルを使って
\[\begin{align*}(\boldsymbol{v},\boldsymbol{w})=\boldsymbol{v}^{\dagger}\boldsymbol{w}&=\begin{bmatrix}\bar{v}_1&\bar{v}_2&\cdots&\bar{v}_n\end{bmatrix}\begin{bmatrix}w_1\\w_2\\\vdots\\w_n\end{bmatrix}\\[6pt]&=\bar{v}_1w_1+\bar{v}_2w_2+\ \cdots\ +\bar{v}_nw_n\tag{9}\end{align*}\]
と定義されます。たとえば、
\[\boldsymbol{v}=\begin{bmatrix}1+i\\2-i\end{bmatrix},\quad \boldsymbol{w}=\begin{bmatrix}2+5i\\1-i\end{bmatrix}\tag{10}\]
であるとき、
\[(\boldsymbol{v},\boldsymbol{w})=\boldsymbol{v}^{\dagger}\boldsymbol{w}=(1-i)(2+5i)+(2+i)(1-i)=10+2i\tag{11}\]
となります。計算間違いがあるといけないので、念のために Python でも確認しておきましょう。
# In[4]
# 複素ベクトルを定義
v = np.array([1+1j, 2-1j])
w = np.array([2+5j, 1-1j])
# 内積(v,w)
vw = np.dot(hermitian(v), w)
print(vw)
# (10+2j)
実数ベクトルとは異なり、複素ベクトルの内積は順序によって値が変わります。
# In[5]
# 内積(w,v)
wv = np.dot(hermitian(w), v)
print(wv)
# (10-2j)
実行結果を比較するとわかるように、$\boldsymbol{w}^{\dagger}\boldsymbol{v}$ は $\boldsymbol{v}^{\dagger}\boldsymbol{w}$ の複素共役となっています。これは任意のベクトル同士の内積でも成り立ちます。
\[(\boldsymbol{v},\boldsymbol{w})=\overline{(\boldsymbol{w},\boldsymbol{v})}\tag{12}\]
他にも内積について以下の定理が成立します。
\[\begin{align*}&(\boldsymbol{u}+\boldsymbol{v},\boldsymbol{w})=(\boldsymbol{u},\boldsymbol{w})+(\boldsymbol{v},\boldsymbol{w})\tag{13}\\[6pt]&(c\boldsymbol{v},\boldsymbol{w})=\bar{c}(\boldsymbol{v},\boldsymbol{w})=(\boldsymbol{v},\bar{c}\boldsymbol{w})\tag{14}\\[6pt]&(\boldsymbol{v},\boldsymbol{v})\geq 0\tag{15}\end{align*}\]
また、$A\boldsymbol{v}$ と $\boldsymbol{w}$ の内積について、以下の重要な定理が成り立ちます。
\[(A\boldsymbol{v}, \boldsymbol{w})=(\boldsymbol{v},A^{\dagger}\boldsymbol{w})\tag{16}\]
複素空間におけるノルム
複素ベクトル $\boldsymbol{v}$ の自身との内積 $\boldsymbol{v}^{\dagger}\boldsymbol{v}$ を $\mathbb{C}^n$ におけるノルムの $2$ 乗と定義します。
\[\parallel \boldsymbol{v} \parallel^2=\boldsymbol{v}^{\dagger}\boldsymbol{v}=\bar{v}_1v_1+\bar{v}_2v_2+\ \cdots\ +\bar{v}_nv_n\tag{17}\]
$\bar{v}_kv_k$ は $v_k$ の絶対値の $2$ 乗 $|v_k|^2$ なので、
\[\parallel \boldsymbol{v} \parallel^2=|v_1|^2+|v_2|^2+\ +\cdots\ +|v_n|^2\tag{18}\]
と表せます。もちろん上式は $\mathbb{R}^n$ におけるノルムの定義を包含しています。たとえば複素ベクトル
\[\boldsymbol{v}=\begin{bmatrix}3+2i\\1-i\end{bmatrix}\tag{19}\]
のノルムは次のように計算できます:
\[\parallel \boldsymbol{v} \parallel=\sqrt{9+4+1+1}=\sqrt{15}=3.87298...\tag{20}\]
Python でも確認しておきます。
scipy.linalg.norm() は複素ベクトルにも対応しています。
# In[6]
# 複素ベクトルを定義
v = np.array([3+2j, 1-1j])
# vのノルムを計算
v_norm = linalg.norm(v)
print(v_norm)
# 3.872983346207417
[参考文献] Wikipedia, 『ストラング:線形代数イントロダクション』
(9) 式の左辺を、v†w= → (v, w)=v†w= としたほうが、
(9) 式が (v, w) の定義であることが明示されてよいと思いました。
確かにそうですね。
直しておきました。
ありがとうございます。
下記は誤植と思われますので、ご確認ください。
式番号で、(11) が 2 個あります。
(13) 式の真ん中の式で、c → \bar c
(15) 式の右辺で、(v, Aw) → (v, A†w)
(6), (7) 式の ( ) 内はスカラーなので、( )† → \bar ( ) のほうが
よいのではないでしょうか。
訂正しました。
ありがとうございます。
【ChatGPT講義】共役転置
共役転置(きょうやくてんち)とは、行列の重要な操作の一つです。まず、行列とは、数や数式を縦と横に並べたもので、数学や物理学などの分野で幅広く使われます。共役転置は、与えられた行列の要素を複素共役に変えつつ、行と列を入れ替える操作です。要するに、行列の要素を上下逆さまにしたものを取り、かつ各要素を複素共役にするわけです。では、具体的な例を見てみましょう。以下の行列を考えます。
A = [a b c]
[d e f]
この行列Aの共役転置を表現すると、Aの上下を逆さまにし、かつ各要素を複素共役に変えた行列A†(Aダガー)を得ることができます。
A† = [a* d*]
[b* e*]
[c* f*]
ここで、aはaの複素共役を表します。同様に、dはdの複素共役、bはbの複素共役、eはeの複素共役、cはcの複素共役、fはfの複素共役を表します。共役転置は、物理学や工学などの応用分野で頻繁に使用されます。例えば、量子力学では、量子状態を表すためのベクトルや行列に対して共役転置が行われます。また、信号処理や通信工学においても、信号の解析や伝送路の特性を評価するために共役転置が用いられます。以上が、共役転置の概要です。共役転置は行列の要素を複素共役に変えつつ、行と列を入れ替える操作であり、多くの応用分野で重要な役割を果たしています。
【ChatGPT講義】自己随伴行列
自己随伴行列は、正方行列であり、その共役転置が元の行列と等しい行列です。つまり、行列Aが自己随伴行列であるとは、A = A^*(またはA = A^H)が成り立つことを意味します。自己随伴行列は、実数の場合には対称行列と同じ概念です。実数の場合は共役転置と転置が等しいため、自己随伴行列は必ず対称行列になります。自己随伴行列にはいくつかの特徴的な性質があります。以下に挙げます。
・自己随伴行列の固有値は実数であり、固有ベクトルは互いに直交します。
・自己随伴行列は、正規行列とも呼ばれ、正規直交固有ベクトルを持ちます。
・自己随伴行列は、エルミート形(実数の場合は対称形)に対角化可能です。
・自己随伴行列は、量子力学や信号処理などの分野で広く応用されています。例えば、量子力学のハミルトニアン行列や、信号処理の共分散行列などが自己随伴行列として表現されます。
以上が、自己随伴行列についての予備校風の授業内容です。自己随伴行列は、行列の性質を理解する上で重要な概念であり、数学や応用科学のさまざまな分野で活用されています。