Ch.5 §5.3 — Cramer’s Rule, Inverses, and Volumes (크래머 공식·역행렬·부피)

행렬식의 세 가지 응용 — 해 공식, 역행렬 공식, 기하학적 부피 해석

행렬식이 단순한 “가역성 판별기”에서 벗어나 \(\mathbf{A}\mathbf{x}=\mathbf{b}\) 의 명시적 해(Cramer), 역행렬의 닫힌 형태 (\(\mathbf{C}^\top / \det \mathbf{A}\)), 그리고 \(n\) 차원 평행육면체의 부피라는 세 가지 응용으로 어떻게 뻗어나가는지를 보인다. 야코비안으로서의 변수 치환, 외적(cross product)의 행렬식 정의까지 — §5.3의 모든 응용을 기하학적 직관과 함께 정리한다.

Math
Linear Algebra
저자

Kwangmin Kim

공개

2026년 04월 10일

1 이 절의 위치

Ch.5의 마지막 절이다. §5.1~§5.2 는 “행렬식이 무엇이고 어떻게 계산하는가”를 다뤘다. §5.3 은 “그래서 행렬식을 어디에 쓰는가”를 답한다.

§5.1 행렬식의 성질 (공리)
  ↓
§5.2 순열과 여인수 (계산 공식)
  ↓
§5.3 Cramer 공식·역행렬·부피  ← 지금 여기
  ↓
Ch.6 고윳값: det(A - λI) = 0 (특성방정식)

§5.3의 핵심 메시지:

행렬식은 단순한 “가역성 스위치”가 아니라 해·역·부피를 하나의 언어로 표현하는 도구다.

세 가지 응용:

  1. Cramer 공식: \(\mathbf{A}\mathbf{x} = \mathbf{b}\) 의 각 성분이 두 행렬식의 비율로 표현
  2. 역행렬 공식: \(\mathbf{A}^{-1} = \mathbf{C}^\top / \det \mathbf{A}\) (여인수 행렬의 전치)
  3. 부피: $|| = $ 행(또는 열)이 만드는 \(n\) 차원 평행육면체의 부피

세 응용은 보기보다 서로 긴밀하게 연결되어 있다. 셋 모두 “한 기둥을 바꾸면 어떤 일이 일어나는가”라는 공통 질문에서 출발한다.


2 응용 1: Cramer 공식

2.1 왜 Cramer가 필요한가

소거법(LU 분해)과 QR 분해로 \(\mathbf{A}\mathbf{x} = \mathbf{b}\) 를 푸는 것은 실무에서 이미 해결된 문제다. 그럼 왜 또 다른 방법을 배우는가?

이유 1 — 이론적 명시성: Cramer 공식은 해 \(x_i\)입력 \(\mathbf{A}, \mathbf{b}\) 의 다항식 함수로 직접 표현한다. 이것이 “\(\mathbf{b}\) 가 조금 변하면 \(\mathbf{x}\) 도 어떻게 변하는가”같은 민감도 분석에 결정적이다.

이유 2 — 기호 계산: 문자가 섞인 시스템 (예: \(\mathbf{A}(t)\mathbf{x}(t) = \mathbf{b}(t)\) 에서 \(t\) 가 매개변수)을 풀 때, 소거법은 분기가 많아져 복잡해진다. Cramer는 분기 없이 단일 공식으로 해를 준다.

이유 3 — 작은 시스템: 2×2, 3×3 에서는 손으로 풀기에 충분히 간결하다.

단점: \(\mathcal{O}(n \cdot n!)\) 연산량. \(n \geq 4\) 에서는 실전 계산에 부적합.

2.2 Strang의 “한 열 치환” 트릭

Cramer 공식의 증명은 놀라울 정도로 우아하다. 핵심 아이디어는:

\(\mathbf{I}\) 의 한 열을 \(\mathbf{x}\) 로 바꾼 행렬의 행렬식은 \(x_i\) 자체다.”

왜? \(\mathbf{I}\) 는 상삼각이므로 행렬식이 대각 곱이다. 대각에서 1 대신 \(x_i\) 가 들어가면 행렬식이 \(x_i\) 로 바뀐다.

\(n = 3\) 에서 \(x_1\) 찾기: \(\mathbf{I}\) 의 첫 번째 열을 \(\mathbf{x}\) 로 치환한 행렬 \(\mathbf{X}_1\) 를 정의한다.

\[\mathbf{X}_1 = \begin{bmatrix} x_1 & 0 & 0 \\ x_2 & 1 & 0 \\ x_3 & 0 & 1 \end{bmatrix} \implies \det \mathbf{X}_1 = x_1\]

이제 \(\mathbf{A} \cdot \mathbf{X}_1\) 을 계산한다. 핵심 관찰: 행렬 곱에서 결과의 첫 번째 열 \(= \mathbf{A}\) 의 첫째 열에 \(x_1\) 을 곱하고, 둘째 열에 \(x_2\) 를 곱하고, 셋째 열에 \(x_3\) 를 곱한 것의 합 \(= \mathbf{A}\mathbf{x} = \mathbf{b}\). 둘째, 셋째 열은 \(\mathbf{A}\) 의 둘째, 셋째 열 그대로.

\[\mathbf{A} \cdot \mathbf{X}_1 = \begin{bmatrix} b_1 & a_{12} & a_{13} \\ b_2 & a_{22} & a_{23} \\ b_3 & a_{32} & a_{33} \end{bmatrix} = \mathbf{B}_1\]

여기서 \(\mathbf{B}_1\) 은 “\(\mathbf{A}\) 의 첫 번째 열을 \(\mathbf{b}\) 로 바꾼 행렬”이다.

양변의 행렬식을 성질 9 (곱셈 규칙)로 취하면:

\[\det \mathbf{A} \cdot \det \mathbf{X}_1 = \det \mathbf{B}_1\]

\[\det \mathbf{A} \cdot x_1 = \det \mathbf{B}_1 \implies x_1 = \frac{\det \mathbf{B}_1}{\det \mathbf{A}}\]

완성. 유사하게 \(\mathbf{I}\)\(j\) 번째 열에 \(\mathbf{x}\) 를 넣으면 \(x_j\) 를 얻는다.

2.3 Cramer 공식 (일반)

Cramer 공식

\(\det \mathbf{A} \neq 0\) 일 때 \(\mathbf{A}\mathbf{x} = \mathbf{b}\) 의 해는:

\[\boxed{x_j = \frac{\det \mathbf{B}_j}{\det \mathbf{A}}, \quad j = 1, 2, \ldots, n}\]

여기서 \(\mathbf{B}_j\)\(\mathbf{A}\)\(j\) 번째 열을 \(\mathbf{b}\) 로 교체한 행렬.

직관: 각 해 성분 \(x_j\) 는 “원래 행렬식”과 “\(j\) 번째 열이 우변 \(\mathbf{b}\) 로 대체되었을 때의 행렬식”의 비율이다. 이 비율이 얼마나 큰가가 \(j\) 번째 미지수가 얼마나 큰 값을 가져야 하는지를 결정한다.

기하학적 해석: \(\det \mathbf{A}\)\(\mathbf{A}\) 열들의 평행육면체 부피. \(\det \mathbf{B}_j\)\(j\) 번째 기둥을 \(\mathbf{b}\) 방향으로 회전시킨 평행육면체의 부피. 두 부피의 비율이 \(\mathbf{b}\)\(j\) 번째 좌표 \(x_j\) — 말 그대로 “\(\mathbf{b}\) 를 기저 \(\mathbf{a}_j\) 방향으로 얼마나 뻗어나간 것인가”의 척도.

2.4 예시 — \(2 \times 2\) 직접 풀이

\[3x_1 + 4x_2 = 2, \quad 5x_1 + 6x_2 = 4\]

행렬 형태:

\[\mathbf{A} = \begin{bmatrix} 3 & 4 \\ 5 & 6 \end{bmatrix}, \quad \mathbf{b} = \begin{bmatrix} 2 \\ 4 \end{bmatrix}\]

세 개의 행렬식:

\[\det \mathbf{A} = 3 \cdot 6 - 4 \cdot 5 = 18 - 20 = -2\]

\[\det \mathbf{B}_1 = \det\begin{bmatrix} \mathbf{2} & 4 \\ \mathbf{4} & 6 \end{bmatrix} = 12 - 16 = -4\]

\[\det \mathbf{B}_2 = \det\begin{bmatrix} 3 & \mathbf{2} \\ 5 & \mathbf{4} \end{bmatrix} = 12 - 10 = 2\]

:

\[x_1 = \frac{-4}{-2} = 2, \quad x_2 = \frac{2}{-2} = -1\]

검증: \(3 \cdot 2 + 4 \cdot (-1) = 6 - 4 = 2\) ✓, \(5 \cdot 2 + 6 \cdot (-1) = 10 - 6 = 4\) ✓.

import numpy as np

A = np.array([[3, 4],
              [5, 6]], dtype=float)
b = np.array([2, 4], dtype=float)

# Cramer 공식
def cramer(A, b):
    det_A = np.linalg.det(A)
    if abs(det_A) < 1e-12:
        raise ValueError("A is singular")
    n = len(b)
    x = np.zeros(n)
    for j in range(n):
        Bj = A.copy()
        Bj[:, j] = b
        x[j] = np.linalg.det(Bj) / det_A
    return x

x_cramer = cramer(A, b)
x_solve = np.linalg.solve(A, b)

print(f"Cramer 해:  {x_cramer}")
print(f"NumPy 해: {x_solve}")
print(f"검증 Ax:    {A @ x_cramer}")
print(f"목표 b:      {b}")

2.5 Cramer의 비용 분석

\(n\) 개의 해를 구하려면 \(n + 1\) 개의 행렬식을 계산해야 한다 (\(\mathbf{A}\) 하나 + \(\mathbf{B}_1, \ldots, \mathbf{B}_n\)). 각 행렬식이 빅 공식으로는 \(\mathcal{O}(n!)\), 총 \((n+1)!\) 개 항.

\(n\) Cramer (빅 공식) 소거법 (LU)
2 6 3
5 720 ~50
10 39 916 800 ~500
20 \(\approx 5 \times 10^{19}\) ~4000

실무 권고: \(n \geq 4\) 에서는 Cramer 대신 np.linalg.solve (LU 기반)를 쓴다. Cramer는 이론적·상징적 도구로만 사용한다.


3 응용 2: 역행렬 공식 \(\mathbf{A}^{-1} = \mathbf{C}^\top / \det \mathbf{A}\)

3.1 유도 — Cramer 공식을 \(\mathbf{I}\) 의 각 열에 적용

\(\mathbf{A}^{-1}\) 을 구한다는 것은 \(\mathbf{A}\mathbf{X} = \mathbf{I}\) 를 푸는 것. 즉 \(\mathbf{I}\) 의 각 열 \(\mathbf{e}_k\) 를 우변으로 하는 \(n\) 개의 시스템 \(\mathbf{A}\mathbf{x}^{(k)} = \mathbf{e}_k\) 를 푼다.

Cramer를 \(\mathbf{b} = \mathbf{e}_k\) 에 적용:

\[x_j^{(k)} = (\mathbf{A}^{-1})_{jk} = \frac{\det \mathbf{B}_j^{(k)}}{\det \mathbf{A}}\]

여기서 \(\mathbf{B}_j^{(k)}\)\(\mathbf{A}\)\(j\) 번째 열을 \(\mathbf{e}_k\) 로 교체한 행렬.

핵심 관찰: \(\mathbf{e}_k\) 로 교체된 열을 따라 여인수 전개하면, 비영 성분은 오직 \(k\) 번째 행의 1 뿐이다. 이 전개의 결과가 정확히 \((k, j)\) 여인수 \(C_{kj}\).

\[\det \mathbf{B}_j^{(k)} = C_{kj}\]

따라서:

\[(\mathbf{A}^{-1})_{jk} = \frac{C_{kj}}{\det \mathbf{A}}\]

주의 — 인덱스 순서: \((j, k)\) 위치에 \(C_{kj}\) 가 들어간다. 행과 열이 바뀌어 있다. 이 때문에 공식이 “여인수 행렬의 전치”로 표현된다.

3.2 역행렬 공식 (최종)

역행렬의 여인수 공식

\[\boxed{\mathbf{A}^{-1} = \frac{\mathbf{C}^\top}{\det \mathbf{A}}}\]

여기서 \(\mathbf{C}\)여인수 행렬: \(C_{ij} = (-1)^{i+j} \det \mathbf{M}_{ij}\).

\(\mathbf{C}^\top\)고전 수반(classical adjugate / adjoint) 이라 부르며 \(\text{adj}(\mathbf{A})\) 로도 쓴다.

\((i, j)\) 성분 형태: \[(\mathbf{A}^{-1})_{ij} = \frac{C_{ji}}{\det \mathbf{A}}\]

3.3 2×2 공식 검증

\[\mathbf{A} = \begin{bmatrix} a & b \\ c & d \end{bmatrix}\]

여인수 계산: - \(C_{11} = (-1)^{1+1} \cdot d = d\) - \(C_{12} = (-1)^{1+2} \cdot c = -c\) - \(C_{21} = (-1)^{2+1} \cdot b = -b\) - \(C_{22} = (-1)^{2+2} \cdot a = a\)

여인수 행렬:

\[\mathbf{C} = \begin{bmatrix} d & -c \\ -b & a \end{bmatrix}\]

전치:

\[\mathbf{C}^\top = \begin{bmatrix} d & -b \\ -c & a \end{bmatrix}\]

역행렬:

\[\mathbf{A}^{-1} = \frac{1}{ad - bc}\begin{bmatrix} d & -b \\ -c & a \end{bmatrix}\]

이것이 우리가 고등학교에서 배운 유명한 공식이다. Cramer + 여인수로 완전히 유도됨.

3.4 공식의 직접 증명: \(\mathbf{A}\mathbf{C}^\top = (\det \mathbf{A})\mathbf{I}\)

핵심 정체성:

\[\mathbf{A}\mathbf{C}^\top = (\det \mathbf{A}) \mathbf{I}\]

이 등식을 보이면 역행렬 공식이 따라온다 (\(\mathbf{A}^{-1} = \mathbf{C}^\top / \det \mathbf{A}\)).

대각선 성분 증명: \((\mathbf{A}\mathbf{C}^\top)_{ii}\)\(\mathbf{A}\)\(i\) 행과 \(\mathbf{C}^\top\)\(i\) 열의 내적. \(\mathbf{C}^\top\)\(i\) 열은 \(\mathbf{C}\)\(i\) 행, 즉 \((C_{i1}, C_{i2}, \ldots, C_{in})\).

\[(\mathbf{A}\mathbf{C}^\top)_{ii} = \sum_{j=1}^n a_{ij} C_{ij} = \det \mathbf{A}\]

이것이 바로 \(i\) 행에 따른 여인수 전개다 (§5.2). 모든 \(i\) 에 대해 대각 성분이 \(\det \mathbf{A}\).

비대각 성분 증명: \(i \neq k\)\((\mathbf{A}\mathbf{C}^\top)_{ik}\)\(\mathbf{A}\)\(i\) 행과 \(\mathbf{C}^\top\)\(k\) 열 (\(= \mathbf{C}\)\(k\) 행)의 내적.

\[(\mathbf{A}\mathbf{C}^\top)_{ik} = \sum_{j=1}^n a_{ij} C_{kj}\]

이 합은 “\(\mathbf{A}\)\(i\) 행”을 “\(\mathbf{A}\)\(k\) 행의 여인수들”과 내적한 것. 이것을 다른 행렬 \(\mathbf{A}^*\) 의 행렬식으로 해석할 수 있다:

\(\mathbf{A}^*\)\(\mathbf{A}\)\(k\) 행을 \(i\) 행으로 복사해 덮어쓴 행렬. 그러면: - \(\mathbf{A}^*\)\(k\) 행을 따라 여인수 전개 = \(\sum_j a_{ij}^* C_{kj}^* = \sum_j a_{ij} C_{kj}\) (여인수는 그 행을 사용하지 않으므로 변화 없음) - \(\mathbf{A}^*\)\(i\) 행과 \(k\) 행이 같으므로 성질 4에 의해 \(\det \mathbf{A}^* = 0\)

따라서 \((\mathbf{A}\mathbf{C}^\top)_{ik} = 0\) (\(i \neq k\)). \(\square\)

결합: \(\mathbf{A}\mathbf{C}^\top\) 는 대각 성분이 모두 \(\det \mathbf{A}\), 비대각은 모두 0. 즉 \((\det \mathbf{A})\mathbf{I}\). 이것이 역행렬 공식의 공식화된 증명이다 — Cramer 없이 직접 검증 가능.

3.5 예시: 합 행렬의 역행렬

\[\mathbf{A} = \begin{bmatrix} 1 & 0 & 0 & 0 \\ 1 & 1 & 0 & 0 \\ 1 & 1 & 1 & 0 \\ 1 & 1 & 1 & 1 \end{bmatrix}\]

\(\det \mathbf{A} = 1\) (하삼각, 대각 1 곱).

주장: 역행렬은 “차분 행렬”이다.

\[\mathbf{A}^{-1} = \begin{bmatrix} 1 & 0 & 0 & 0 \\ -1 & 1 & 0 & 0 \\ 0 & -1 & 1 & 0 \\ 0 & 0 & -1 & 1 \end{bmatrix}\]

여인수 검증 (몇 개만): - \(C_{11}\) (1행 1열 제거, 부호 \(+\)): 3×3 하삼각 대각 1 → 1 - \(C_{12}\) (1행 2열 제거, 부호 \(-\)): 3×3 상삼각 형태인데 대각 1 → 1, 부호 \(-\) 붙여 \(-1\) - \((\mathbf{A}^{-1})_{21} = C_{12}/\det \mathbf{A} = -1\)

직관: 합 행렬 \(\mathbf{A}\) 는 “누적합”을 계산한다 (\(\mathbf{A}\mathbf{x}_i = x_1 + x_2 + \cdots + x_i\)). 차분 행렬은 그 반대 — 인접 성분의 차이를 계산한다. 둘이 역행렬이 되는 것은 자연스럽다.

# 합 행렬의 역행렬 검증
A = np.tril(np.ones((4, 4)))
print("A =")
print(A)
print(f"det A = {np.linalg.det(A):.0f}")

A_inv = np.linalg.inv(A)
print(f"\nA⁻¹ =")
print(A_inv.astype(int))

# 누적합 / 차분 해석
x = np.array([1.0, 2.0, 3.0, 4.0])
print(f"\nx = {x}")
print(f"Ax (누적합)    = {A @ x}")      # [1, 3, 6, 10]
print(f"A⁻¹ (Ax)       = {A_inv @ (A @ x)}")  # [1, 2, 3, 4] ✓

4 응용 3: 부피 — \(|\det \mathbf{A}|\) = 평행육면체 부피

4.1 질문

평면 위의 세 점 \((x_1, y_1), (x_2, y_2), (x_3, y_3)\) 이 이루는 삼각형의 면적은?

밑변 × 높이 공식은 실제 좌표로는 제곱근이 잔뜩 들어간다. 행렬식이 이를 제곱근 없이 표현한다.

4.2 삼각형 면적 — 3×3 행렬식의 절반

삼각형 면적 공식

세 꼭짓점 \((x_1, y_1), (x_2, y_2), (x_3, y_3)\) 의 삼각형 면적:

\[\text{면적} = \frac{1}{2}\left| \det\begin{bmatrix} x_1 & y_1 & 1 \\ x_2 & y_2 & 1 \\ x_3 & y_3 & 1 \end{bmatrix} \right|\]

한 꼭짓점이 원점 \((0, 0)\) 이면 2×2로 간결해진다:

\[\text{면적} = \frac{1}{2}\left| \det\begin{bmatrix} x_1 & y_1 \\ x_2 & y_2 \end{bmatrix} \right| = \frac{1}{2}|x_1 y_2 - x_2 y_1|\]

4.3 평행사변형 면적 — 2×2 행렬식

삼각형에 \(\frac{1}{2}\) 가 붙는 이유는, 두 변 \((x_1, y_1), (x_2, y_2)\) 로 정의되는 평행사변형의 면적이 삼각형의 두 배이기 때문이다. 따라서 평행사변형 면적은:

\[\text{평행사변형 면적} = |x_1 y_2 - x_2 y_1| = |\det \mathbf{A}|\]

증명 (부피가 세 공리를 만족함): 면적 함수가 \(\det\) 과 같은 공리를 만족함을 보이면, 유일성에 의해 면적 = \(|\det|\).

  1. 공리 1 (\(\det \mathbf{I} = 1\)): \((1, 0)\)\((0, 1)\) 이 이루는 평행사변형은 단위 정사각형, 면적 1. ✓

  2. 공리 2 (행 교환 → 부호 반전): 두 변을 바꿔도 같은 평행사변형이므로 “크기”는 같다. 부호는 방향성(handedness)을 나타낸다. 양수 = 반시계 방향, 음수 = 시계 방향. 절대값은 같다. ✓

  3. 공리 3 (행별 선형성): 한 변을 \(t\) 배 늘리면 평행사변형도 \(t\) 배 늘어난다. 한 변이 두 벡터의 합이면 면적도 덧셈 — 이것은 Figure 5.3 에서 기하적으로 증명된다. “두 평행사변형이 합쳐져 하나가 된다”는 식의 조각 맞추기 논증. ✓

세 공리 모두 만족 → 면적은 정확히 \(|\det|\).

핵심 교훈: 공리 기반 정의의 위력. “행렬식이 부피임”을 원소별로 증명할 필요 없이, “부피 함수가 세 공리를 만족한다”만 보이면 된다.

4.4 3차원 평행육면체

\(\mathbb{R}^3\) 에서 세 벡터 \(\mathbf{a}_1, \mathbf{a}_2, \mathbf{a}_3\) 가 이루는 평행육면체(상자)의 부피는:

\[\text{부피} = \left|\det \begin{bmatrix} \mathbf{a}_1^\top \\ \mathbf{a}_2^\top \\ \mathbf{a}_3^\top \end{bmatrix}\right|\]

행이든 열이든 상관없다 (성질 10 \(\det \mathbf{A} = \det \mathbf{A}^\top\)).

특수 케이스 — 직육면체: 변들이 서로 수직이고 길이 \(r, s, t\) 이면:

\[\mathbf{A} = \begin{bmatrix} r & 0 & 0 \\ 0 & s & 0 \\ 0 & 0 & t \end{bmatrix}, \quad \det \mathbf{A} = rst\]

고등학교 공식 “가로 × 세로 × 높이”가 자연스럽게 나온다.

4.5 \(n\) 차원 일반화

\(n\) 개의 벡터가 이루는 \(n\) 차원 평행육면체의 초부피(hypervolume)도 같은 공식:

\[\text{초부피} = |\det \mathbf{A}|\]

이것은 단순한 관습이 아니다. \(n\) 차원 Lebesgue 측도의 적분 변환 공식에서 직접 나온다 (아래 야코비안 참조).

4.6 부호의 의미 — 방향성

\(\det \mathbf{A} > 0\) 이면 “오른손 좌표계” 유지 (양의 방향). \(\det \mathbf{A} < 0\) 이면 “왼손 좌표계” (반사됨).

2D에서: - \(\det > 0\) = 반시계 방향 (표준) - \(\det < 0\) = 시계 방향 (거울상)

3D에서: - \(\det > 0\) = 오른손 법칙 (엄지/검지/중지가 \(\mathbf{a}_1, \mathbf{a}_2, \mathbf{a}_3\)) - \(\det < 0\) = 왼손 법칙

“부호 있는 부피(signed volume)”라는 개념은 미적분의 변수 치환에서 필수적이다.

import matplotlib.pyplot as plt
from matplotlib.patches import Polygon

# 삼각형 면적 예시
pts = np.array([[1, 1],
                [4, 2],
                [2, 5]], dtype=float)

# 3x3 행렬식 공식
M = np.column_stack([pts, np.ones(3)])
area = 0.5 * abs(np.linalg.det(M))
print(f"삼각형 꼭짓점: {pts.tolist()}")
print(f"면적 (행렬식 공식): {area:.4f}")

# 신발끈 공식으로 검증
shoelace = 0.5 * abs(
    pts[0,0]*(pts[1,1] - pts[2,1]) +
    pts[1,0]*(pts[2,1] - pts[0,1]) +
    pts[2,0]*(pts[0,1] - pts[1,1])
)
print(f"면적 (신발끈):     {shoelace:.4f}")

# 시각화
fig, ax = plt.subplots(figsize=(7, 6))
tri = Polygon(pts, closed=True, alpha=0.4, color='steelblue',
              edgecolor='navy', linewidth=2)
ax.add_patch(tri)

for i, (x, y) in enumerate(pts):
    ax.plot(x, y, 'ko', markersize=8)
    ax.annotate(f'$P_{i+1}=({x:.0f},{y:.0f})$', (x, y),
                textcoords='offset points', xytext=(8, 8))

centroid = pts.mean(axis=0)
ax.annotate(f'면적 = {area:.2f}', centroid,
            ha='center', fontsize=12, fontweight='bold')

ax.set_xlim(0, 6)
ax.set_ylim(0, 6)
ax.set_aspect('equal')
ax.grid(True, alpha=0.3)
ax.set_title('삼각형 면적 = (1/2)|det|')
plt.tight_layout()
plt.show()

5 야코비안 — 미적분에서의 변수 치환

5.1 문제

2차원 적분 \(\iint_R f(x, y) \, dx \, dy\) 를 극좌표 \((r, \theta)\) 로 바꿀 때 “부피 요소”는 어떻게 변하는가?

5.2 공식 유도

\(x = r\cos\theta, y = r\sin\theta\). 미소 영역 \(dr \, d\theta\) 에 대응하는 \(xy\) 평면의 미소 영역은 “폴라 박스” — 두 변이:

  • \(r\) 방향: \((\partial x/\partial r, \partial y/\partial r) \cdot dr = (\cos\theta, \sin\theta) \, dr\)
  • \(\theta\) 방향: \((\partial x/\partial\theta, \partial y/\partial\theta) \cdot d\theta = (-r\sin\theta, r\cos\theta) \, d\theta\)

이 두 변이 이루는 평행사변형의 면적 = 2×2 행렬식의 절대값:

\[|J| = \left|\det\begin{bmatrix} \cos\theta & -r\sin\theta \\ \sin\theta & r\cos\theta \end{bmatrix}\right| = |r\cos^2\theta + r\sin^2\theta| = r\]

결론:

\[dx \, dy = r \, dr \, d\theta\]

\(r\) 이 바로 야코비안(Jacobian)이다.

5.3 일반 공식

\((x, y) = \mathbf{T}(u, v)\) 가 변수 치환이면:

\[\iint_R f(x, y) \, dx \, dy = \iint_S f(\mathbf{T}(u, v)) \cdot |J(u, v)| \, du \, dv\]

\[J(u, v) = \det\begin{bmatrix} \partial x/\partial u & \partial x/\partial v \\ \partial y/\partial u & \partial y/\partial v \end{bmatrix}\]

직관: \(\mathbf{T}\)\((u, v)\) 공간을 \((x, y)\) 공간으로 “구부리는” 변환. 각 점에서의 변환은 국소적으로 선형이고 (야코비 행렬), 그 행렬식의 절대값이 “국소 부피 배율”이다. 미소 영역 \(du\,dv\)\(|J| \, du\,dv\) 만큼으로 변환되는 것.

5.4 3차원 및 \(n\) 차원

3D 적분에서 야코비안은 3×3 행렬식:

\[dx\,dy\,dz = |J| \, du\,dv\,dw, \quad J = \det\begin{bmatrix} \partial(x,y,z) \\ \partial(u,v,w) \end{bmatrix}\]

예시 — 구면좌표: \(x = \rho\sin\phi\cos\theta, y = \rho\sin\phi\sin\theta, z = \rho\cos\phi\)

야코비안 계산 결과: \(J = \rho^2 \sin\phi\)

따라서 \(dV = \rho^2 \sin\phi \, d\rho \, d\phi \, d\theta\). 이것이 전기장·중력 문제에서 구 대칭 적분의 기본 도구.

5.5 머신러닝 응용 — Normalizing Flows

변수 치환 공식의 현대적 응용: 확률 밀도 함수가 변수 치환 하에서 어떻게 변하는가.

\(\mathbf{z} \sim p(\mathbf{z})\) 이고 \(\mathbf{x} = \mathbf{f}(\mathbf{z})\) 이면:

\[p(\mathbf{x}) = p(\mathbf{z}) \cdot |\det \mathbf{J}_\mathbf{f}^{-1}|\]

또는 로그로:

\[\log p(\mathbf{x}) = \log p(\mathbf{z}) - \log|\det \mathbf{J}_\mathbf{f}|\]

Normalizing Flow 계열 생성 모델 (Real NVP, Glow, FFJORD)은 이 공식의 직접 적용이다. \(\mathbf{f}\) 를 쌓아서 가우시안 → 복잡한 분포로 변환하고, 각 층에서 \(\log|\det \mathbf{J}|\) 를 효율적으로 계산하는 것이 핵심 설계 과제.

효율적 야코비안이 가능한 \(\mathbf{f}\) 들: - 원소별 변환 (diagonal Jacobian) - 커플링 레이어 (triangular Jacobian) - Planar/Radial flow

이것이 행렬식이 “오래된 개념”이 아니라 최신 딥러닝에서도 여전히 중심 역할을 하는 이유다.


6 외적(Cross Product) — 3차원 특유의 개념

6.1 정의

\(\mathbb{R}^3\) 의 두 벡터 \(\mathbf{u}, \mathbf{v}\) 의 외적 \(\mathbf{u} \times \mathbf{v}\) 는 다음 행렬식으로 정의된다.

\[\mathbf{u} \times \mathbf{v} = \det\begin{bmatrix} \mathbf{i} & \mathbf{j} & \mathbf{k} \\ u_1 & u_2 & u_3 \\ v_1 & v_2 & v_3 \end{bmatrix}\]

“첫 행이 벡터”라는 게 조금 이상하지만, 여인수 전개를 형식적으로 적용하면:

\[\mathbf{u} \times \mathbf{v} = (u_2 v_3 - u_3 v_2)\mathbf{i} + (u_3 v_1 - u_1 v_3)\mathbf{j} + (u_1 v_2 - u_2 v_1)\mathbf{k}\]

결과는 벡터이다 (스칼라인 내적과 다름).

6.2 주요 성질

성질 1 — 반대칭: \(\mathbf{v} \times \mathbf{u} = -(\mathbf{u} \times \mathbf{v})\). 행렬식의 행 교환 → 부호 반전.

성질 2 — 수직: \(\mathbf{u} \times \mathbf{v}\)\(\mathbf{u}, \mathbf{v}\) 모두에 수직.

증명: \(\mathbf{u} \cdot (\mathbf{u} \times \mathbf{v})\) 을 계산하면 “\(\mathbf{u}\) 행을 두 번 가진 3×3 행렬식” 이 된다 — 두 같은 행이므로 0.

성질 3 — 자기 자신과는 0: \(\mathbf{u} \times \mathbf{u} = \mathbf{0}\) (두 같은 행).

성질 4 — 길이 = 평행사변형 면적:

\[\|\mathbf{u} \times \mathbf{v}\| = \|\mathbf{u}\|\|\mathbf{v}\||\sin\theta|\]

이것이 \(\mathbf{u}, \mathbf{v}\) 가 만드는 평행사변형의 면적이다. “외적의 길이 = 밑변 × 높이” 기하 공식.

성질 5 — 오른손 법칙: \(\mathbf{u} \times \mathbf{v}\) 의 방향은 오른손 엄지 — \(\mathbf{u}\) 에서 \(\mathbf{v}\) 쪽으로 손가락을 말면 엄지가 가리키는 방향.

6.3 왜 외적은 3차원에서만 정의되는가

외적은 일반 차원으로 직접 일반화되지 않는다. : \(\mathbb{R}^n\) 에서 “\(n-1\) 개 벡터에 모두 수직인 벡터”를 만드는 연산은 있지만, “두 벡터에 수직인 유일한 벡터”는 \(n = 3\) 에서만 성립한다.

\(\mathbb{R}^4\) 에서는 두 벡터가 수직한 2차원 공간을 남기므로 방향이 하나로 정해지지 않는다.

일반화된 개념들: - 외대수(Exterior algebra): \(\mathbf{u} \wedge \mathbf{v}\) (웨지 곱) — 2-형식. 임의 차원에서 정의. - Hodge 쌍대: \(n = 3\) 에서 2-형식을 벡터로 식별. - 3D 벡터 외적은 “\(n = 3\) 의 웨지 곱 + Hodge 쌍대”의 특수 케이스.

# 외적 계산 예시
u = np.array([1, 2, 3])
v = np.array([4, 5, 6])

cross = np.cross(u, v)
print(f"u × v = {cross}")

# 수직 검증
print(f"u · (u × v) = {u @ cross}")      # 0
print(f"v · (u × v) = {v @ cross}")      # 0

# 평행사변형 면적
area = np.linalg.norm(cross)
sin_theta = area / (np.linalg.norm(u) * np.linalg.norm(v))
theta_deg = np.degrees(np.arcsin(sin_theta))
print(f"\n평행사변형 면적 = ‖u × v‖ = {area:.4f}")
print(f"사잇각 = {theta_deg:.2f}°")

# 행렬식 형태로 계산
def cross_via_det(u, v):
    """외적을 3x3 행렬식으로 계산"""
    e = np.eye(3)
    return np.array([
        np.linalg.det(np.vstack([e[0], u, v])),
        np.linalg.det(np.vstack([e[1], u, v])),
        np.linalg.det(np.vstack([e[2], u, v])),
    ])

print(f"\n행렬식 정의로 계산한 외적: {cross_via_det(u, v)}")

7 세 응용의 연결

Cramer, 역행렬, 부피는 서로 독립된 주제가 아니다. 모두 “한 열을 치환했을 때 부피가 어떻게 변하는가” 라는 공통 질문에서 나온다.

응용 무엇을 치환하는가 결과
Cramer \(\mathbf{A}\)\(j\) 열을 \(\mathbf{b}\) \(x_j = \det\mathbf{B}_j / \det\mathbf{A}\)
역행렬 \(\mathbf{A}\)\(j\) 열을 \(\mathbf{e}_k\) \((\mathbf{A}^{-1})_{jk} = C_{kj} / \det\mathbf{A}\)
부피 (치환 없음) \(\text{Vol} = \|\det\mathbf{A}\|\)

통합 직관: “\(\mathbf{A}\) 의 열들이 만드는 상자의 부피”를 기준으로, 한 기둥을 다른 방향으로 바꿨을 때 부피의 변화 비율이 곧 해(또는 역행렬 성분)를 준다.


8 실무 주의사항

8.1 1. 역행렬 공식은 이론용

\(\mathbf{A}^{-1} = \mathbf{C}^\top / \det\mathbf{A}\) 는 아름답지만 \(\mathcal{O}(n \cdot n!)\) 연산이라 실무에선 쓰이지 않는다. 역행렬이 정말 필요하면 LU 분해 후 \(\mathbf{A}\mathbf{X} = \mathbf{I}\)\(n\) 개 시스템을 푸는 것이 빠르다.

8.2 2. 역행렬 자체를 계산하지 말 것

\(\mathbf{A}^{-1}\mathbf{b}\) 가 필요하면 역행렬 계산 없이 np.linalg.solve(A, b) 를 쓴다. LU 분해 한 번 + 전/후치환 — 역행렬 계산보다 3~4배 빠르고 수치적으로 더 안정.

8.3 3. Cramer는 3×3 이하에서만 손계산

\(n \geq 4\) 에서는 소거법이 훨씬 빠르다.

8.4 4. 부피 계산의 수치 안정성

큰 행렬에서 \(|\det\mathbf{A}|\) 는 언더플로우/오버플로우가 쉽게 난다. np.linalg.slogdet() 를 써서 \(\log|\det|\) 과 부호를 분리해 다룬다. Normalizing Flow, 다변량 가우시안 로그우도 등에서 표준 관행.

# slogdet 사용 예시
A = np.random.randn(10, 10)
sign, logdet = np.linalg.slogdet(A)
print(f"det(A) 부호: {sign}")
print(f"log|det(A)|: {logdet:.4f}")
print(f"det(A) = {sign * np.exp(logdet):.4e}")
print(f"NumPy det(A) = {np.linalg.det(A):.4e}")

9 핵심 요약

Cramer 공식 (해)
  x_j = det B_j / det A
  B_j = A의 j번째 열을 b로 교체
  유도: A · (I의 j열 = x) = B_j, 곱셈 규칙

역행렬 공식 (닫힌 형태)
  A⁻¹ = Cᵀ / det A
  (A⁻¹)_{ij} = C_{ji} / det A
  핵심 등식: A Cᵀ = (det A) I
  대각 성분 = 여인수 전개 = det A
  비대각 성분 = 두 같은 행 가진 행렬식 = 0

부피 (기하)
  2D: |평행사변형| = |det A| (2x2)
  3D: |평행육면체| = |det A| (3x3)
  nD: |초부피|    = |det A| (n×n)
  부호: 오른손 좌표계 (+) / 왼손 (-)

  증명: 부피가 det의 세 공리를 만족 → 유일성

야코비안 (미적분)
  dx dy = |J| du dv
  J = det(변환의 미분)
  극좌표 J = r, 구면좌표 J = ρ² sin φ
  머신러닝: Normalizing Flow의 핵심

외적 (3D 특유)
  u × v = det([i j k; u; v])
  |u × v| = 평행사변형 면적
  방향: 오른손 법칙
  n차원 일반화: 외대수 (wedge product)

세 응용의 통합
  모두 "한 열 치환 → 부피 변화"의 언어
  Cramer, 역행렬, 부피가 같은 구조

실무 주의
  Cramer / 역행렬 공식: 이론용, 계산은 LU
  큰 det: slogdet 사용

10 관련 주제

선행 지식

후속 주제

  • 다변수 미적분 (Math) — 야코비안의 체계적 학습
  • SVD (예정) — \(|\det| = \prod \sigma_i\) 특이값의 곱
  • Normalizing Flow (Deep Learning) — \(\log|\det \mathbf{J}|\) 의 효율적 계산

Subscribe

Enjoy this blog? Get notified of new posts by email: