単位行列と逆行列

単位行列と逆行列

 次回記事では連立一次方程式 $A\boldsymbol{x}=\boldsymbol{p}$ を解くための一般的な手順を考えます。
 その準備として、今回は単位行列と逆行列を定義して、その扱い方を学びます。
 

単位行列

単位行列の定義

 行列 $A$ に左右どちらから掛けても $A$ となるような行列を単位行列 (identity matrix) とよびます。$2\times 2$ の単位行列は
 
\[I=\begin{bmatrix}1&0\\0&1\end{bmatrix}\tag{1}\]
で表されます。たとえば、$A$ に $I$ を左から掛けると
 
\[IA=\begin{bmatrix}1&0\\0&1\end{bmatrix}
\begin{bmatrix}a&b\\c&d\end{bmatrix}
=\begin{bmatrix}a&b\\c&d\end{bmatrix}\]
となって $A$ は変化しません。同様にして $AI=A$ も確かめられます。もちろん任意のベクトル $\boldsymbol{u}$ も単位行列によって変化しません。このように恒等変換を施す単位行列はスカラーの $1$ に相当します。一般に $n\times n$ の単位行列は、対角成分が $1$、他はすべて $0$ の行列として表されます:
 
\[I=\begin{bmatrix}1&0 &\cdots &0\\
0&1 &\cdots &0\\
\vdots & \vdots &\ddots &\vdots\\
0&0 &\cdots &1\end{bmatrix}\tag{2}\]

numpy.identity()

 Python では numpy.identity() を使って単位行列を作成できます。

# リストSLA017

import numpy as np

# 2×2の単位行列
# [[1 0]
#  [0 1]]
I = np.identity(2, dtype = np.int8)

# 行列Aを定義
A = np.array([[3, 7],
              [9, 5]])

# 行列積AIを計算
AI = np.dot(A, I)

print(AI)
[[3 7]
 [9 5]]

 

逆行列と正則行列

逆行列の定義

 行列 $A$ に左右どちらから掛けても単位行列 $I$ となるような行列、すなわち
 
\[A^{-1}A=AA^{-1}=I\tag{3}\]
を満たすような行列 $A^{-1}$ が存在すれば、$A^{-1}$ を $A$ の 逆行列 (invertible matrix) とよびます。また、自身の逆行列をもつ行列を 正則行列 (regular matrix) とよびます。

 ある行列について、逆行列は存在したとしても 1 個だけです。
 実際、$A$ に互いに相異なる逆行列 $B$ と $C$ が存在したとすると、
 
\[BA=AC=I\tag{4}\]
が成り立ちます。一方で結合法則により
 
\[B(AC)=(BA)C\tag{5}\]
が成り立ちますが、(4) より
 
\[BI=IC\tag{6}\]
となります。すなわち $B=C$ であり、$A$ の逆行列は唯一つであることがわかります。

 行列 $A=\begin{bmatrix}a&b\\c&d\end{bmatrix}$ の逆行列は
 
\[A^{-1}=\frac{1}{ad-bc}\begin{bmatrix}d&-b\\-c&a
\end{bmatrix}\tag{7}\]
で与えられます(実際に $A^{-1}A$ と $AA^{-1}$ を計算して $I$ になることが確かめられます)。ただし、$ad-bc=0$ のときは分母が $0$ になってしまうので逆行列は存在しません。

 $ad-bc$ は $A$ の行列式 $\det A$ なので、(4) は
 
\[A^{-1}=\frac{1}{\det A}\begin{bmatrix}d&-b\\-c&a\end{bmatrix}\tag{8}\]
と表すこともできます。

 行列積 $AB$ の逆行列は
 
\[(AB)^{-1}=B^{-1}A^{-1}\tag{9}\]
で与えられます。実際に $AB$ に左から掛けてみると
 
\[B^{-1}A^{-1}AB=B^{-1}IB=B^{-1}B=I\]
となって確かに単位行列になります。同じように右から掛けても単位行列になります。
 

numpy.linalg.inv()

 numpy.linalg.inv() は配列 a を受け取って、a の逆行列を返します。

# リストSLA018

# 行列aを定義
a = np.array([[1, 2],
              [3, 4]])

# aの逆行列ainv
ainv = np.linalg.inv(a)

# aとainvの積bを計算
b = np.dot(a, ainv)

print("aの逆行列\n{}\n".format(ainv))
print("aとaの逆行列の積\n{}".format(b))
aの逆行列
[[-2.   1. ]
 [ 1.5 -0.5]]

aとaの逆行列の積
[[1.00000000e+00 1.11022302e-16]
 [0.00000000e+00 1.00000000e+00]]

scipy.linalg.inv()

 scipy.linalg.inv() は配列 a を受け取って、a の逆行列を返します。

# リストSLA019

import numpy as np
from scipy import linalg

# 行列aを定義
a = np.array([[7, -2],
              [5,  1]])

# aの逆行列ainv
ainv = linalg.inv(a)

# aとainvの積bを計算
b = np.dot(a, ainv)

print("aの逆行列\n{}\n".format(ainv))
print("aとaの逆行列の積\n{}".format(b))
aの逆行列
[[ 0.05882353  0.11764706]
 [-0.29411765  0.41176471]]

aとaの逆行列の積
[[ 1.00000000e+00 -1.11022302e-16]
 [ 0.00000000e+00  1.00000000e+00]]