[선형대수] 05. 역행렬
역행렬, 역행렬 계산, 역행렬과 거듭제곱
1. 역행렬¶
행렬 \(A\)의 역행렬(inverse matrix)이란 아래와 같이 \(AB = I\)를 만족하는 행렬 \(B\)를 의미한다. 이 때, \(A\)를 \(B\)의 왼쪽 역행렬(left inverse matrix), \(B\)를 \(A\)의 오른쪽 역행렬(right inverse matrix)라고 부른다.
역행렬이 존재하는 행렬을 가역 행렬(invertible matrix)이라 부르며, 행렬식의 값이 0이어서 역행렬이 존재하지 않는 행렬을 특이 행렬(singular matrix)이라고 부른다.
2 * 2 행렬의 역행렬¶
2 * 2 행렬의 역행렬을 구하는 방법은 아래와 같다.
n * n 행렬의 역행렬¶
n * n 행렬의 역행렬을 구하는 방법은 행렬식에서 다룬 수반 행렬을 사용해야 한다. 구하는 방법은 아래와 같다.
2. 역행렬 계산¶
역행렬을 구하는 방법은 다양하지만, 앞서 다뤘던 가우스-조르단 소거법(Gauss Jordan elimination)을 사용하는 것이 가장 간편하다. 절차는 아래와 같다.
- 행렬 \(A\)의 오른쪽에 같은 크기를 갖는 단위 행렬 \(I\)를 첨가해 아래와 같이 첨가 행렬 \([A \vert I]\)를 만든다.
- 이 행렬을 기본 행 연산을 통해 아래와 같이 \([I \vert B]\)를 만든다.
- 만약 이 과정에 성공하여 위와 같은 형태의 첨가 행렬이 나왔을 때, \(A^{-1}=B\)이고, 나오지 않는다면 행렬 \(A\)의 역행렬은 존재하지 않는다.
Python으로 구현하면 아래와 같다.
scalar = int | float
vector = list[scalar]
matrix = list[vector]
def mat_aug_mat(a: matrix, b: matrix) -> matrix:
"""transform matrix into matrix augmented matrix"""
return [v + u for v, u in zip(a, b)]
def mat_coef_inv(a: matrix, b: int) -> tuple:
"""separates coefficient matrix"""
x: matrix = [r[:b] for r in a]
y: matrix = [r[b:] for r in a]
return x, y
def gauss_jordan_eli(mat: matrix) -> matrix:
"""Gauss-Jordan elimination, transform matrix into Gauss-Jordan eliminated form"""
n: int = len(mat)
for i in range(n):
mat[i] = [ele / mat[i][i] for ele in mat[i]]
for j in range(n):
if i == j:
continue
mat_tmp = [ele * -mat[j][i] for ele in mat[i]]
for k in range(len(mat[i])):
mat[j][k] += mat_tmp[k]
return mat
def mat_inv(a: matrix) -> matrix:
"""returns inverted matrix"""
n: int = len(a)
_, res = mat_coef_inv(gauss_jordan_eli(mat_pivot(mat_aug_mat(a, mat_identity(n)))), n)
return res
3. 역행렬의 성질¶
- 역행렬과 거듭 제곱
- 역행렬과 전치 행렬
- 역행렬과 행렬식