역행렬과 연립일차방정식
양쪽에서 곱해 단위행렬이 되는 역행렬을 여인수로 만든 수반행렬과 단위행렬을 붙인 소거의 두 방법으로 구하고, 결과를 곱해서 확인합니다. 피벗이 0일 때의 행 교환과 역행렬이 없는 경우, 연립방정식의 해가 없거나 무한히 많은 경우를 구분합니다.
두 입력 x와 y를 섞어 두 출력을 만들었을 때, 출력만 보고 입력을 되돌릴 수 있을까요? 2x + y = 7과 x + y = 4를 알면 x와 y를 구할 수 있지만, x + y = 2와 2x + 2y = 4는 사실상 같은 정보라서 x와 y를 하나로 정할 수 없습니다. 이 차이를 행렬로 말하면 역행렬이 있느냐의 문제입니다. 이 글에서는 행렬의 연산과 행렬식을 바탕으로 역행렬을 구하는 두 가지 방법을 익히고, 연립방정식의 해가 몇 개인지 판단합니다. 이 글도 선택 심화이며, 8장의 그래프를 먼저 읽어도 됩니다.
역행렬은 양쪽 곱이 단위행렬이다
정사각행렬 A에 대해 인 행렬 을 A의 역행렬(inverse matrix)이라고 합니다. 2 × 2 행렬은 행렬식 가 0이 아닐 때 다음 공식으로 역행렬을 구할 수 있습니다.
대각선의 두 원소를 맞바꾸고, 나머지 두 원소의 부호를 바꾼 뒤, 행렬식으로 나눕니다. 원소마다 역수를 취하는 것이 아니라는 점에 주의해야 합니다. 는 행렬식이 1이므로 이고, 두 행렬을 어느 쪽으로 곱해도 대각선이 1, 나머지가 0이 되어 확인할 수 있습니다.
연립방정식과 소거
연립방정식 2x + y = 7, x + y = 4는 행렬로 입니다. 양변의 왼쪽에 을 곱하면 이므로 x = 7 - 4 = 3, y = -7 + 8 = 1입니다. 원래 두 식에 넣으면 7과 4가 나와 맞습니다.
역행렬을 구하지 않고 식을 직접 바꾸어 풀 수도 있습니다. 계수와 우변을 나란히 붙인 증강행렬(augmented matrix)에서 한 행은 식 하나입니다. 다음 세 가지 기본 행 연산(elementary row operation)은 해의 집합을 바꾸지 않으며, 우변에도 같은 연산을 합니다.
| 연산 | 해의 집합이 바뀌지 않는 이유 |
|---|---|
| 두 행 맞바꾸기 | 식을 적는 순서만 바뀌고, 다시 맞바꾸면 되돌아간다 |
| 한 행에 0이 아닌 c 곱하기 | 양변에 같은 수를 곱한 것이고, 를 곱하면 되돌아간다. 0을 곱하면 식이 사라지므로 허용하지 않는다 |
| 다른 행의 c배 더하기 | 원래 두 식을 만족하는 해는 새 식도 만족하고, 배를 더하면 되돌아간다 |
먼저 두 행을 맞바꾸고, 다음으로 을 했습니다. 둘째 행에서 이라 y = 1이고, 첫째 행에서 x = 3입니다. 한 열을 소거할 때 기준으로 쓰는 0이 아닌 원소를 피벗(pivot)이라 하며, 이 계산에서는 첫 열의 1과 둘째 열의 -1이 피벗이었습니다.
여인수로 만드는 수반행렬
3 × 3 이상의 역행렬은 여인수로 구할 수 있습니다. 앞 글의 는 입니다. 아홉 자리마다 그 행과 열을 지운 소행렬식에 부호 를 곱해 여인수를 구하면 다음과 같습니다.
| 자리 | 소행렬식에 부호를 곱한 계산 | 여인수 |
|---|---|---|
| (1, 1) | 1 | |
| (1, 2) | 6 | |
| (1, 3) | -2 | |
| (2, 1) | -2 | |
| (2, 2) | 1 | |
| (2, 3) | 4 | |
| (3, 1) | 6 | |
| (3, 2) | -3 | |
| (3, 3) | 1 |
여인수를 제자리에 늘어놓은 여인수행렬(cofactor matrix) K를 전치한 것을 수반행렬(adjugate) 라고 합니다.
일반적으로 n × n 행렬 A에 대해 가 성립하므로, 이면 입니다. 전치가 필요한 이유는 곱의 한 칸을 보면 알 수 있습니다. 의 i행 j열은 인데, i = j이면 i행으로 여인수 전개한 것이라 입니다. i ≠ j이면 j행을 i행으로 바꾼 행렬을 j행으로 전개한 것이 되고, 같은 행이 둘인 행렬의 행렬식이므로 0입니다. 이 C에서는 와 가 모두 대각선이 13이고 나머지가 0이므로, 13으로 나누면 역행렬이 됩니다.
K를 전치하지 않고 그대로 쓰면 틀립니다. 이 C에서도 의 첫 행은 이라 13I의 첫 행 과 다릅니다. 앞에서 본 2 × 2 공식도 이 식의 특별한 경우입니다. 의 여인수행렬은 이고, 이것을 전치하면 공식에 나온 행렬이 됩니다.
단위행렬을 붙여 소거하기
여인수를 쓰지 않고, C 옆에 단위행렬 I를 붙인 [C | I]에 행 연산을 해서 왼쪽을 I로 만들 수도 있습니다. 모든 행 연산을 합친 변환을 E라고 하면 [C | I]는 [EC | E]가 됩니다. 왼쪽이 I, 곧 EC = I가 되었다면 E는 C를 되돌리는 행렬이고, 그것이 오른쪽에 남아 있습니다. 이 방법을 가우스–조던 소거(Gauss–Jordan elimination)라고 합니다.
첫 열에서 로 3행 1열을 0으로 만들면 셋째 행은 이 됩니다. 둘째 열에서는 로 위를, 로 아래를 0으로 만들면 셋째 행이 이 되어 13이 새 피벗입니다. 으로 피벗을 1로 만든 뒤, 과 으로 셋째 열의 나머지를 0으로 만들면 끝납니다.
오른쪽이 앞에서 수반행렬로 구한 과 같습니다. 이 과정을 분수로 정확하게 계산하는 코드는 다음과 같습니다. 행과 열의 번호는 수학처럼 1부터 출력하도록 했습니다.
from fractions import Fraction
def inverse_fraction(matrix, show=False):
n = len(matrix)
if n == 0 or any(len(row) != n for row in matrix):
raise ValueError("정사각행렬이어야 합니다")
work = [[Fraction(v) for v in row] + [Fraction(int(i == j)) for j in range(n)]
for i, row in enumerate(matrix)]
for col in range(n):
pivot_row = next((r for r in range(col, n) if work[r][col] != 0), None)
if pivot_row is None:
raise ValueError(f"{col + 1}열에 0이 아닌 피벗이 없어 역행렬이 없습니다")
if pivot_row != col:
work[col], work[pivot_row] = work[pivot_row], work[col]
if show:
print(f"R{col + 1} <-> R{pivot_row + 1}")
pivot = work[col][col]
if pivot != 1:
work[col] = [v / pivot for v in work[col]]
if show:
print(f"R{col + 1} <- R{col + 1} / {pivot}")
for r in range(n):
factor = work[r][col]
if r != col and factor != 0:
work[r] = [x - factor * y for x, y in zip(work[r], work[col])]
if show:
print(f"R{r + 1} <- R{r + 1} - ({factor})R{col + 1}")
return [row[n:] for row in work]
def multiply(left, right):
return [[sum(x * y for x, y in zip(row, column)) for column in zip(*right)] for row in left]
C = [[1, 2, 0], [0, 1, 3], [2, 0, 1]]
inverse = inverse_fraction(C, show=True)
for row in inverse:
print(" ".join(str(x) for x in row))
identity = [[int(i == j) for j in range(3)] for i in range(3)]
print(multiply(C, inverse) == identity, multiply(inverse, C) == identity)
P = [[0, 1, 0], [1, 0, 0], [0, 0, 1]]
print(inverse_fraction(P, show=True) == P)
for bad in ([[1, 2, 3], [2, 4, 6], [0, 1, 1]], [[1, 2, 3], [4, 5, 6]]):
try:
inverse_fraction(bad)
except ValueError as error:
print("오류:", error)R3 <- R3 - (2)R1
R1 <- R1 - (2)R2
R3 <- R3 - (-4)R2
R3 <- R3 / 13
R1 <- R1 - (-6)R3
R2 <- R2 - (3)R3
1/13 -2/13 6/13
6/13 1/13 -3/13
-2/13 4/13 1/13
True True
R1 <-> R2
True
오류: 3열에 0이 아닌 피벗이 없어 역행렬이 없습니다
오류: 정사각행렬이어야 합니다work의 앞 n칸은 계수, 뒤 n칸은 단위행렬로 시작한 부분이고, 행 연산을 할 때 두 부분에 함께 적용합니다. 열마다 0이 아닌 피벗을 찾고, 필요하면 행을 맞바꾸고, 피벗을 1로 만든 뒤, 같은 열의 다른 행을 모두 0으로 만듭니다. Fraction으로 계산하므로 1/13 같은 값이 반올림 없이 정확합니다. 출력된 여섯 연산은 앞에서 손으로 한 연산과 같고, 두 방향의 곱이 모두 단위행렬이라 역행렬이 맞습니다.
기준 자리의 0과 역행렬 없음을 구별한다
위 출력의 P는 첫 피벗 자리가 0입니다. 피벗 자리는 지금 소거하는 열에서 피벗을 놓을 칸으로, 소거의 기준이 되므로 기준 자리라고도 부릅니다. 그렇다고 바로 역행렬이 없다고 판단하면 안 됩니다. 0으로 나눌 수는 없지만, 같은 열의 아래 행에서 0이 아닌 원소를 찾아 행 전체를 맞바꾸면 소거를 계속할 수 있습니다. P는 한 번으로 왼쪽이 I가 되고, 같은 맞바꿈이 오른쪽의 I도 P로 바꾸므로 입니다. 실제로 입니다.
기준 자리 0과 행 교환
P의 첫 피벗이 0이라 나눌 수 없다. 왼쪽과 오른쪽을 함께 교환한다. 각 단계의 값과 전환 이유를 비교합니다.
이산수학 · 역행렬의 실패 조건
기준자리0이면 행 교환 가능성부터 확인합니다
0으로 나누기 전에 아래 행을 살핍니다. 행 교환은 왼쪽 계수와 오른쪽 단위행렬 부분에 함께 적용합니다.
- 화살표: 판단 뒤의 처리 순서
- 마름모: 아래 행의 같은 열 확인
실수 정사각행렬의 앞 열 소거가 끝난 상태입니다. 현재 행과 아래 행의 이 열 값이 모두0이면 새 피벗을 놓을 수 없습니다. 기준자리0 하나만 보고 실패하지 않습니다. 이 실패는 역행렬 없음이며 모든 우변의 연립방정식에 해가 없다는 뜻은 아닙니다.
이 예의 조건
- 본문과 전체 도표의 예를 따라 0 피벗부터 전체 행 교환까지 진행합니다.
관계도의 보충 설명
| 구분 | 전체 도표의 내용 |
|---|---|
| 제목 | 기준 자리 0과 행 교환 |
| 제목·표기 | 기준 자리 0이면 행 교환 가능성부터 확인합니다 |
| 관계 설명 | 정사각행렬의 앞 열 소거가 끝난 상태에서 현재 기준 자리가 0이면 아래 행의 같은 열을 찾고, 0이 아닌 값이 있으면 전체 행을 교환해 계속하며 없으면 역행렬을 만들 수 없습니다. |
| 노드·선 표기 | 현재 기준 자리 = 0 |
| 노드·선 표기 | 0이 아닌 피벗으로 |
| 설명·조건 | 실수 정사각행렬의 앞 열 소거가 끝난 상태입니다. 현재 행과 아래 행의 이 열 값이 모두 0이면 새 피벗을 놓을 수 없습니다. 기준 자리 0 하나만 보고 실패하지 않습니다. 이 실패는 역행렬 없음이며 모든 우변의 연립방정식에 해가 없다는 뜻은 아닙니다. |
| 관찰·상황 | 값·보충 정보 | 변화·이유 |
|---|---|---|
| 0 피벗 P의 첫 피벗이 0이라 나눌 수 없다. |
|
|
| 비영 행 찾기 둘째 행 첫 값 1을 선택한다. |
|
|
| 전체 행 교환 왼쪽과 오른쪽을 함께 교환한다. |
|
|
기준 자리 0과 행 교환
P의 첫 피벗이 0이라 나눌 수 없다. 왼쪽과 오른쪽을 함께 교환한다. 각 단계의 값과 전환 이유를 비교합니다.
이산수학 · 역행렬의 실패 조건
기준자리0이면 행 교환 가능성부터 확인합니다
0으로 나누기 전에 아래 행을 살핍니다. 행 교환은 왼쪽 계수와 오른쪽 단위행렬 부분에 함께 적용합니다.
- 화살표: 판단 뒤의 처리 순서
- 마름모: 아래 행의 같은 열 확인
실수 정사각행렬의 앞 열 소거가 끝난 상태입니다. 현재 행과 아래 행의 이 열 값이 모두0이면 새 피벗을 놓을 수 없습니다. 기준자리0 하나만 보고 실패하지 않습니다. 이 실패는 역행렬 없음이며 모든 우변의 연립방정식에 해가 없다는 뜻은 아닙니다.
이 예의 조건
- 본문과 전체 도표의 예를 따라 0 피벗부터 전체 행 교환까지 진행합니다.
관계도의 보충 설명
| 구분 | 전체 도표의 내용 |
|---|---|
| 제목 | 기준 자리 0과 행 교환 |
| 제목·표기 | 기준 자리 0이면 행 교환 가능성부터 확인합니다 |
| 관계 설명 | 정사각행렬의 앞 열 소거가 끝난 상태에서 현재 기준 자리가 0이면 아래 행의 같은 열을 찾고, 0이 아닌 값이 있으면 전체 행을 교환해 계속하며 없으면 역행렬을 만들 수 없습니다. |
| 노드·선 표기 | 현재 기준 자리 = 0 |
| 노드·선 표기 | 0이 아닌 피벗으로 |
| 설명·조건 | 실수 정사각행렬의 앞 열 소거가 끝난 상태입니다. 현재 행과 아래 행의 이 열 값이 모두 0이면 새 피벗을 놓을 수 없습니다. 기준 자리 0 하나만 보고 실패하지 않습니다. 이 실패는 역행렬 없음이며 모든 우변의 연립방정식에 해가 없다는 뜻은 아닙니다. |
| 관찰·상황 | 값·보충 정보 | 변화·이유 |
|---|---|---|
| 0 피벗 P의 첫 피벗이 0이라 나눌 수 없다. |
|
|
| 비영 행 찾기 둘째 행 첫 값 1을 선택한다. |
|
|
| 전체 행 교환 왼쪽과 오른쪽을 함께 교환한다. |
|
|
반면 는 을 하면 둘째 행이 모두 0이 됩니다. 둘째 행이 첫째 행의 두 배라 새로운 정보가 없었던 것입니다. 이 상태에서는 어떤 행과 맞바꾸어도 독립인 행이 늘어나지 않으므로 왼쪽을 I로 만들 수 없고, 이며 역행렬이 없습니다. 코드는 앞 열들의 소거를 마친 뒤 셋째 열에서, 현재 행과 그 아래 행에 0이 아닌 원소가 하나도 없음을 확인하고 오류를 냈습니다. 피벗 자리 하나가 0인 것과, 그 열에 피벗으로 쓸 원소가 전혀 없는 것은 다른 상황입니다.
역행렬이 없어도 해가 있을 수 있다
계수행렬의 역행렬이 없으면 연립방정식의 해는 하나로 정해지지 않지만, 해가 없을 수도 있고 무한히 많을 수도 있습니다. x + y = 2와 2x + 2y = 5를 소거하면 둘째 식에서 첫째 식의 두 배를 빼서 0 = 1이 나오므로, 두 식을 함께 만족하는 해가 없습니다. 둘째 식의 우변이 4라면 같은 소거에서 0 = 0이 되어 새 조건이 사라지고, y = t를 마음대로 정하면 x = 2 - t가 되어 해가 무한히 많습니다.
두 경우 모두 계수행렬의 행렬식은 0입니다. 그래서 행렬식이 0이라는 것만으로는 해가 없는지 무한히 많은지 알 수 없고, 우변까지 함께 소거해 보아야 합니다. 앞의 S에서 역행렬을 구하지 못한 것은 역행렬이 없다는 뜻일 뿐, S를 계수로 하는 모든 연립방정식에 해가 없다는 뜻은 아닙니다.
정리
- 역행렬은 양쪽에서 곱해 단위행렬이 되는 행렬이며, 2 × 2에서는 대각선을 맞바꾸고 나머지 부호를 바꾼 뒤 행렬식으로 나눕니다.
- 기본 행 연산인 맞바꾸기, 0이 아닌 수 곱하기, 다른 행의 배수 더하기는 해의 집합을 바꾸지 않으므로 연립방정식을 풀 때 씁니다.
- 수반행렬은 여인수행렬을 전치한 것이고, 행렬식이 0이 아니면 입니다.
- [A | I]에 행 연산을 해서 왼쪽을 I로 만들면 오른쪽에 역행렬이 남으며, 구한 역행렬은 양쪽으로 곱해서 확인합니다.
- 피벗 자리가 0이면 아래 행과 맞바꾸어 계속하고, 그 열에 0이 아닌 원소가 없을 때만 역행렬이 없습니다. 역행렬이 없을 때 연립방정식의 해가 없는지 무한히 많은지는 우변까지 소거해 판단합니다.
연습 문제
1. 소거로 풀기
x + 2y = 5, 3x + 4y = 11을 소거로 풀고, 구한 해를 원래 식에 넣어 확인하세요.
해설 보기
둘째 식에서 첫째 식의 3배를 빼면 , 곧 -2y = -4이므로 y = 2입니다. 첫째 식에 넣으면 x + 4 = 5이므로 x = 1입니다. 원래 식에 넣으면 1 + 4 = 5, 3 + 8 = 11로 모두 맞습니다. 해는 (x, y) = (1, 2)입니다.
2. 해가 무한히 많은 경우
x - y = 1, 2x - 2y = 2의 해는 몇 개인가요? 해를 모두 나타내세요.
해설 보기
둘째 식은 첫째 식의 두 배라서 조건이 사실상 하나뿐입니다. y = t를 아무 실수로 정하면 x = t + 1이 두 식을 모두 만족하므로, 해는 (t + 1, t) 꼴로 무한히 많습니다. x = 1, y = 0처럼 해를 하나만 적으면 해 전체를 나타낸 것이 아닙니다. 계수행렬 의 행렬식이 0이라 역행렬은 없지만, 해가 없는 것은 아닙니다.
3. 피벗이 0인 2 × 2 행렬
의 역행렬이 있는지 판단하고, 있다면 2 × 2 공식으로 구한 뒤 소거할 때 어떤 행 연산부터 해야 하는지 설명하세요.
해설 보기
으로 0이 아니므로 역행렬이 있습니다. 공식에 따라 입니다. 소거로 구할 때는 첫 피벗 자리가 0이라 그대로 나눌 수 없으므로, 먼저 아래 행과 맞바꾸는 부터 합니다. 첫 피벗이 0이어도 역행렬이 있을 수 있다는 것을 보여 주는 예입니다. 본문의 inverse_fraction에 Q를 show=True로 넣어도 첫 줄에 R1 <-> R2가 출력됩니다.
소거를 복습할 때는 피벗 값을 계산하기 전에 어떤 행 연산을 썼는지부터 적어 보세요. 역행렬과 증강행렬은 OpenStax의 역행렬 설명에서, 수반행렬 공식은 MIT Strang 강의에서 더 볼 수 있습니다. 다음 글 관계와 그래프를 계산하는 행렬에서는 같은 행렬 곱셈을 참과 거짓의 연산으로 바꾸어 관계를 계산합니다.