上三角行列、下三角行列の性質を確認する。
参考:http://mathtrain.jp/triangularmatrix
$n \times n$
の正方行列$A=(a_{ij})$について、
「$i > j$ならば$a_{ij}=0$を満たす行列を上三角行列
「$i < j$ならば$a_{ij}=0$を満たす行列を下三角行列
という。
三角行列の固有値は対角成分に等しい。
上三角行列同士の積は上三角行列になり、 下三角行列同士の積は下三角行列になる。
正則な上三角行列の逆行列は、上三角行列である。 正則な下三角行列の逆行列は、下三角行列である。
ある正方行列Aを与えた時に、それが三角行列であるかどうかを判定する関数を作れ。
そして三角行列を用い、三角行列の固有値・積・逆行列に関する性質に対し実例をひとつ挙げて確認せよ。
import matplotlib.pyplot as plt
%matplotlib inline
import numpy as np
import theano
import theano.tensor as T
def check_triangular(mat, upper=True):
for row in range(len(mat)):
for col in range(len(mat[row])):
if upper:
if row > col and (not mat[row][col] == 0):
return False
else:
if row < col and (not mat[row][col] == 0):
return False
return True
A = np.array([[1, 2, 3],
[0, 1, 2],
[0, 0, 1]])
B = np.array([[1, 1, 1],
[0, 1, 1],
[0, 0, 1]])
C = np.array([[3, 0, 0],
[3, 2, 0],
[3, 2, 1]])
D = np.array([[1, 0, 0],
[1, 1, 0],
[1, 1, 1]])
E = np.array([[1, 1, 1],
[1, 1, 1],
[0, 0, 1]])
for m in [A, B, C, D, E]:
if check_triangular(m):
print("Upper triangular matrix.")
elif check_triangular(m, upper=False):
print("Lower triangular matrix.")
else:
print("Not triangular matrix.")
w, v = np.linalg.eigh(A, UPLO="L")
w
w, v = np.linalg.eigh(B, UPLO="L")
w
w, v = np.linalg.eigh(C, UPLO="U")
w
w, v = np.linalg.eigh(D, UPLO="U")
w
np.dot(A, B)
np.dot(C, D)
上三角行列同士の積は上三角行列になり、 下三角行列同士の積は下三角行列になることがわかった。
逆行列を求めるには、まず行列式が0でないことを確認する。
行列式はnumpy.linalg.det()で、逆行列はnumpy.linalg.inv()で求める。
label = ["A","B","C","D"]
label_iter = iter(label)
for m in [A, B, C, D]:
print(label_iter.__next__() + "-"*30)
det = np.linalg.det(m)
print(det)
if det:
print(np.linalg.inv(m))
正則な上三角行列の逆行列は、上三角行列であり、正則な下三角行列の逆行列は、下三角行列であることが確認できた。