Logseq/Major Study/pages/2.3 행렬 계산과 A = LU.md
songyc macbook df8adcd51f 그래프 3분할: English Study / Programming / Major Study 독립 그래프로 분리
- pages 119개·assets 140개+스냅샷 폴더 3개를 참조 추적 기반으로 분류 이동 (전부 git rename, 내용 무변경)
- 공용 페이지(template·card·contents) 3벌 복제, config.edn·custom.css 그래프별 복제
- 옛 Index Page는 _archive/ 보관, 루트 logseq/ 잔재 보존
- CLAUDE.md: 그래프·Anki 프로파일 구조 규칙 신설, 경로·검사 스크립트 갱신
- 복원 지점: 태그 before-graph-split

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01G8rNxLqi5rYjRamC8uwiJW
2026-08-05 19:05:21 +09:00

15 KiB
Executable File
Raw Blame History

deck:: Logseq/전공공부/선형대수학

  • 핵심 개념

    • 이 절의 요지 3가지:
      • n \times n 행렬 AU 로 바꾸는 소거는 약 \frac{1}{3}n^3 번의 곱셈과 뺄셈이 필요하다.
      • ② 우변 bc 로 바꾸는 데는 n^2 번이면 된다.
      • ③ 행 교환이 없는 소거는 ALU 로 분해한다 (A = LU 의 2가지 증명).
    • 가우스-조르단 소거법 (Gauss-Jordan elimination): AX = I 를 열 단위로 한꺼번에 푸는 방법.
      • 📌 원문 (p.97): ((6a635ba0-717a-49ea-81c6-1b80acfb2f4c))
      • 아이디어: A^{-1}k 번째 열 x_kAx_k = e_k 의 해다 (e_kIk 번째 열). n 개의 방정식이 모두 같은 계수행렬 A 를 가지므로 첨가행렬을 [A \ \ I] 로 잡고 소거를 한 번만 적용한다.
      • [A \ \ I] \xrightarrow{\text{소거}} [I \ \ A^{-1}]
      • ⚠️ 가우스-조르단은 (역대입 대신) 피벗 위쪽까지 소거해 A 자리를 완전히 I 로 만든다. Ax=b 하나를 푸는 것보다 느리다: A^{-1} 가 정말 필요할 때만 쓴다.
      • 💡 이 책의 일관된 메시지: x = A^{-1}b 라고 해서 실제로 A^{-1} 를 계산하지는 마라. 소거+역대입이 훨씬 싸다.
    • 소거법의 비용 (연산 횟수 세기)
      • 📌 원문 (p.97): ((6a635bbc-cd20-4362-8dcc-ae180ca53cba))
      • 세는 단위: 소거의 기본 동작은 "피벗 행에 승수를 곱해서 아래 행에서 뺀다", 성분 하나를 갱신할 때마다 곱셈 1번 + 뺄셈 1번이 한 쌍으로 든다. 아래에서 "1번"은 이 (곱셈, 뺄셈) 한 쌍을 뜻한다.
      • 왜 1단계가 약 n^2 번인가: 1열의 피벗 아래를 전부 0으로 만드는 비용:
        • ⚠️ 흔한 오해부터: "1단계의 목표는 1열에 0을 (n-1) 개 만드는 것이니 (n-1) 번이면 되는 것 아닌가?", 아니다. 0 하나를 만들려면 그 행 전체를 바꿔야 한다.
          • "2행에서 1행 × \ell_{21} 을 뺀다"는 것은 방정식 전체의 연산이다: (방정식 ②) ← (방정식 ②) \ell_{21} × (방정식 ①). 등식이 유지되려면 2행의 모든 성분에서 각각 1행의 대응 성분 × \ell_{21} 을 빼야 한다. 1열 성분 하나만 빼고 나머지를 안 건드리면 방정식 자체가 망가진다.
          • 즉 "0이 되는 자리"는 행마다 1개지만, 그 부산물로 그 행의 나머지 성분들도 전부 새 값으로 갱신된다. 진짜 비용은 여기서 나온다.
        • 그림으로 (n = 4): 1단계에서 값이 바뀌는 자리를 표시하면 다음과 같다:
          • \begin{bmatrix} p & \times & \times & \times \\ \bullet & \ast & \ast & \ast \\ \bullet & \ast & \ast & \ast \\ \bullet & \ast & \ast & \ast \end{bmatrix} \qquad \begin{aligned} &p = \text{피벗}, \ \times = \text{1행 (불변)} \\ &\bullet = 0 \text{이 되는 자리 (목표)} \\ &\ast = \text{덩달아 바뀌는 자리} \end{aligned}
          • 갱신되는 성분 = \bullet\ast 전부 = 세로 (n-1)× 가로 n 열의 직사각형. "제곱"의 정체는 이 직사각형의 넓이다: (n-1) \times n = n^2 - n \approx n^2.
          • n=4 로 세어보면: 3행 × 4성분 = 12번 (= 4^2 - 4).
        • 코드로 보면, 1단계는 이중 루프다:
          • # 1단계: 1열의 피벗 A[0][0] 아래를 전부 0으로
            for i in range(1, n):            # 바깥 루프: 피벗 아래의 각 행 → (n-1)번 반복
                l = A[i][0] / A[0][0]        # 이 행의 승수 (행마다 나눗셈 1번)
                for j in range(n):           # 안쪽 루프: 그 행의 모든 성분 → n번 반복
                    A[i][j] -= l * A[0][j]   # 곱셈 1번 + 뺄셈 1번 = "1번"
            
          • 바깥 루프 (n-1)× 안쪽 루프 n 번 = (n-1)\,n \approx n^2. 루프가 두 겹이라 제곱이 된다: 한 겹(n)은 "행이 여러 개"에서, 다른 한 겹(n)은 "행 하나가 성분 여러 개"에서 온다.
        • 요약: 1단계 = (n-1)× n 성분 = n^2 - n 번 ≈ n^2 번. (1행 자체는 바뀌지 않으므로 정확히는 n^2 - n 이지만, n 이 크면 차이는 무시된다.)
          • 💡 2단계와의 연결 (이미 이해한 부분): 2단계는 똑같은 이중 루프를 오른쪽 아래 (n-1) \times (n-1) 부분행렬에서 도는 것, 그래서 (n-2)(n-1) \approx (n-1)^2.
      • 왜 총합이 \frac{1}{3}n^3 인가: 단계마다 문제가 한 사이즈씩 줄어든다:
        • 1단계가 끝나면 1행과 1열은 완성. 남은 작업은 오른쪽 아래의 (n-1) \times (n-1) 부분행렬, 크기 (n-1) 짜리 문제를 새로 시작하는 것과 같다. 그래서 2단계 ≈ (n-1)^2 번, 3단계 ≈ (n-2)^2 번, …, 마지막 단계 ≈ 1^2 번.
        • \text{총합} \approx n^2 + (n-1)^2 + (n-2)^2 + \cdots + 2^2 + 1^2 = \frac{1}{3}n\left(n+\tfrac{1}{2}\right)(n+1) \approx \frac{1}{3}n^3
        • 💡 왜 제곱의 합이 \frac{1}{3}n^3 인가: 1^2 + 2^2 + \cdots + n^2 은 곡선 y = x^2 아래 넓이를 폭 1짜리 계단으로 근사한 것과 같다. 그 넓이가 적분 \int_0^n x^2\,dx = \frac{1}{3}n^3. 정확한 공식 \frac{1}{3}n(n+\frac{1}{2})(n+1) 을 전개해도 최고차항은 \frac{1}{3}n^3 이고, n 이 충분히 크면 \frac{1}{2}1 은 중요하지 않다.
        • 수치로 확인: n = 100 이면 제곱의 합은 정확히 338{,}350, 근사값 \frac{100^3}{3} = 333{,}333, 오차 1.5%. n 이 클수록 더 정확해진다.
      • 왜 우변은 n^2 번뿐인가: b 는 열 하나(성분 n 개)라서 행렬보다 훨씬 싸다:
        • ① 순방향 b \to c: 1단계에서 b_2, \cdots, b_n 에서 b_1 의 배수를 뺀다 → (n-1) 번. 2단계는 b_1 과 무관하므로 (n-2) 번. … 마지막 단계는 1번.
        • ② 역대입 c \to x: x_nu_{nn}x_n = c_n 에서 피벗으로 나누는 1단계. x_{n-1} 은 (이미 구한 x_n 을 대입 + 피벗으로 나눔) 2단계. … x_1(n-1) 개를 대입하고 나누는 n 단계.
        • \underbrace{[(n-1) + (n-2) + \cdots + 1]}_{①\ b \to c} + \underbrace{[1 + 2 + \cdots + (n-1) + n]}_{②\ c \to x} = n^2
        • 💡 n^2 이 되는 짝짓기 트릭 (p.98): ①의 (n-1) 과 ②의 1, ①의 (n-2) 와 ②의 2, … 를 짝지으면 매 쌍의 합이 n 이고 쌍이 (n-1) 개 → n(n-1). ②에 짝 없이 남은 마지막 n 하나를 더하면 n(n-1) + n = n^2. 딱 떨어진다.
      • 결론: LU 를 저장하는 이유를 수치로:
        • A \to LU 분해(비싼 부분): \approx \frac{1}{3}n^3 번 => {{c1 한 번}} 하면 된다. id:: 6a654a5b-b7fb-4f00-a8c9-41e828a913cb 새로운 b 마다 드는 비용: {{c1 Lc=b}} (순방향) + {{c1 Ux = c}} (역대입) = n^2
        • n = 1{,}000 이면 \frac{1}{3}n^3 \approx 3.3 억 번 vs n^2 = 100 만 번, 두 번째 b 부터는 약 333배 싸게 푼다.
        • ⚠️ 우변 처리에 필요한 정보(각 단계의 승수 \ell_{ij})가 전부 L 에 저장되어 있다는 것이 핵심, 그래서 A 를 다시 소거할 필요가 없다.
      • 크기 감각: n = 1{,}000 이면 약 1초. n 이 2배가 되면 시간은 2^3 = 8 배 (n^3 규칙). 실무의 큰 행렬은 대부분 희소행렬 (sparse matrix, 대부분 성분이 0)이라 A = LU 계산이 훨씬 빠르다.
    • A = LU 분해: 이 장의 핵심 공식
      • 소거 과정 EA = U 를 뒤집으면 A = E^{-1}U = LU. 2.2 소거행렬과 역행렬의 식 (11)이 \ell_{ij}L 의 정확한 위치에 배치됨을 보여줬다.
      • L U 의 정확한 형태 🧩:
        • L = 주대각선이 1이고, 주대각선 아래 (i,j) 에 승수 \ell_{ij} 가 들어간 하삼각행렬.
        • U = 소거가 끝난 상삼각행렬, 주대각선에 피벗들이 놓인다.
        • A = LU = \begin{bmatrix} 1 & & \\ \ell_{21} & 1 & \\ \ell_{31} & \ell_{32} & 1 \end{bmatrix} \begin{bmatrix} \text{피벗}_1 & * & * \\ & \text{피벗}_2 & * \\ & & \text{피벗}_3 \end{bmatrix}
    • 증명 1, 행 단위로 보기: L 에서 \ell_{ij} 가 제자리에 있는 이유 (p.99~100)
      • 📌 원문 (p.99): ((6a635be3-d31e-4142-a915-420dc9b58289))
      • 소거 중 피벗 행에서 빼는 것은 A 의 원래 행이 아니라 이미 완성된 U 의 행이다 (피벗 행은 그 뒤로 다시 바뀌지 않으므로).
      • (U \text{의 3행}) = (A \text{의 3행}) - \ell_{31}(U \text{의 1행}) - \ell_{32}(U \text{의 2행}) \tag{3}
      • 📌 원문 (식 (3), p.100): 🔗 PDF 위치
        • A=LU 증명 식 (3) (p.100)
      • 이 식을 이항하면:
      • (A \text{의 3행}) = \ell_{31}(U \text{의 1행}) + \ell_{32}(U \text{의 2행}) + 1 \cdot (U \text{의 3행}) \tag{4}
      • 📌 원문 (식 (4), p.100): 🔗 PDF 위치
        • A=LU 증명 식 (4) (p.100)
      • 식 (4)가 정확히 행렬곱 A = LU 의 3행이다. L 의 3행 [\ell_{31} \ \ \ell_{32} \ \ 1] 이 그대로 읽힌다. 모든 크기 n 에서 성립.
    • 증명 2, (열)×(행) 랭크 1 행렬로 보기 (p.100~101)
      • 소거를 "A 에서 (L의 열)·(U의 행) 인 랭크 1 행렬을 빼는 것"으로 본다.
      • 1단계: \ell_1 = (1, \ell_{21}, \ell_{31}, \cdots)u_1 = (A 의 1행) 에 대해 A - \ell_1 u_1 = A_2 를 만들면 A_2 의 1행과 1열은 전부 0.
      • 반복하면 매 단계 "L 의 열 \ell_j × U 의 피벗 행 $u_j$" 를 소거하고, 조각을 다시 합치면:
      • A = \ell_1 u_1 + \ell_2 u_2 + \cdots + \ell_n u_n = \begin{bmatrix} \ell_1 & \cdots & \ell_n \end{bmatrix}\begin{bmatrix} u_1 \\ \vdots \\ u_n \end{bmatrix} = LU \tag{5}
      • 💡 1장 마지막의 "(열)×(행) 곱셈" 관점이 여기서 진가를 발휘한다. U 의 피벗 행 u_k 는 앞에 (k-1) 개의 0, L 의 열 \ell_k 도 위에 (k-1) 개의 0으로 시작.
    • 행 교환 없이 A = LU 분해가 가능한 조건 (p.101)
      • "행 교환이 없고 피벗에 0이 없는 A = LU 분해는 언제 가능한가?"
        • 📌 원문 (질문, p.101): ((6a635bfb-bcd2-4ff3-9fd5-31424ab7abb4))
      • 답: A왼쪽 상단 모서리에 있는 모든 k \times k 부분행렬 A_k 가 가역행렬일 때만 가능하다 (k = 1, \cdots, n).
        • 📌 원문 (답, p.101): ((6a635c01-2fd8-4235-a9d8-052b6b5f93d7))
      • 이유: 소거 과정이 좌상단 모서리 부분행렬을 순서대로 분해하기 때문, A_k = L_k U_k 이 성립하려면 각 A_k 가 가역이어야 한다.
      • 💡 직관: k 번째 피벗은 좌상단 k\times k 블록 안에서 결정된다. 앞쪽 블록이 특이하면 그 시점에 피벗 0을 만나 행 교환이 필요해진다.
    • LU 를 이용한 Ax = b 풀이, 두 개의 삼각 시스템
      • A = LU 를 알고 나면: Ax = bL(Ux) = b ⟺ 두 단계로 분리.
        • Lc = b순방향 대입으로 풀어 c 를 얻는다 (소거가 우변에 하던 일).
        • Ux = c역대입으로 풀어 x 를 얻는다.
      • 💡 같은 A 에 우변 b 만 바뀌는 문제를 여러 번 풀 때 진가: 비싼 \frac{1}{3}n^3 분해는 한 번만, 이후는 b 마다 n^2 만 든다.
  • 스스로 점검

    • A \to U 소거, 우변 처리(b \to c \to x)의 연산 횟수는 각각 대략 얼마인가? 유도 과정도 요약하라.
      • A \to U 는 약 \frac{1}{3}n^3 번: 1단계는 (n-1)× n 성분 ≈ n^2 번이고, 단계마다 부분행렬 크기가 하나씩 줄어 n^2 + (n-1)^2 + \cdots + 1^2 \approx \int_0^n x^2 dx = \frac{1}{3}n^3.
      • 우변은 정확히 n^2 번: 순방향 (n-1) + \cdots + 1, 역대입 1 + 2 + \cdots + n, 합치면 n^2. 그래서 LU 를 한 번 구해두면 새 b 마다 n^2 만 든다 (n=1000 이면 분해 대비 약 333배 싸다).
    • A = LU 에서 L 의 주대각선과 그 아래에는 정확히 무엇이 들어가는가?
      • 주대각선에는 1, 주대각선 아래 (i,j) 성분에는 소거 때 쓴 승수 \ell_{ij} 가 부호 그대로 들어간다. (U 의 주대각선에는 피벗.)
    • "소거에서 피벗 행에 곱해 빼는 행은 A 의 행이 아니라 U 의 행이다". 왜 이 관찰이 A = LU 증명의 핵심인가?
      • (Ui) = (Ai) - \sum_{j<i} \ell_{ij}(Uj) 을 이항하면 (Ai) = \sum_{j<i}\ell_{ij}(Uj) + 1\cdot(Ui), 이것이 정확히 행렬곱 LUi 행이기 때문.
    • 행 교환 없이 A = LU 가 가능할 필요충분조건은?
      • 왼쪽 상단의 모든 k \times k 부분행렬 A_k (k=1,\cdots,n)가 가역인 것.
    • [A \ \ I] \to [I \ \ A^{-1}] (가우스-조르단)이 Ax=b 풀이보다 느린데도 배우는 이유는?
      • A^{-1} 전체가 필요할 때 n 개의 방정식 Ax_k = e_k 를 소거 한 번으로 동시에 풀어주는 체계적 방법이기 때문. (실전에서는 A^{-1} 를 만들지 않고 LU 로 푸는 것이 원칙.)
  • ✏️ 연습문제 풀이 (솔루션 참고)

    • 문제 1 (책 표시: 중요한 문제): 순방향 소거가 \begin{bmatrix} 1&1 \\ 1&2 \end{bmatrix}x = \begin{bmatrix} 5\\7 \end{bmatrix}\begin{bmatrix} 1&1 \\ 0&1 \end{bmatrix}x = \begin{bmatrix} 5\\2 \end{bmatrix} 로 바꾼다. 빈칸을 채워라.
      • \ell_{21} = 1 (2행에서 1행 × 1 을 뺌). 역대입 단계의 행렬은 L = \begin{bmatrix} 1&0 \\ 1&1 \end{bmatrix}.
      • LUx_1 = (5,2) 에 곱하면 원래 방정식 Ax = (5,7) 을 되찾는다. 문자로: Ux = cL 을 곱하면 Ax = b.
      • 💡 "L 은 소거를 되돌리는 행렬"이라는 A = LU 의 의미를 2×2 로 확인하는 문제.
    • 문제 7 (책 표시: 꼭 풀어볼 만한 문제): 대칭행렬 A = \begin{bmatrix} a&a&a&a \\ a&b&b&b \\ a&b&c&c \\ a&b&c&d \end{bmatrix}L, U 와 피벗 4개가 존재할 조건.
      • 소거하면 모든 승수가 1: L = \begin{bmatrix} 1&&& \\ 1&1&& \\ 1&1&1& \\ 1&1&1&1 \end{bmatrix}, U = \begin{bmatrix} a&a&a&a \\ &b-a&b-a&b-a \\ &&c-b&c-b \\ &&&d-c \end{bmatrix}.
      • 피벗은 a, \ b-a, \ c-b, \ d-c → 4개의 조건: a \neq 0, b \neq a, c \neq b, d \neq c.
      • 💡 피벗이 "연속된 값의 차"로 나오는 아름다운 패턴. 대칭행렬의 소거가 얼마나 규칙적인지 보여준다.
    • 문제 10: L = \begin{bmatrix} 1&0&0 \\ 1&1&0 \\ 1&1&1 \end{bmatrix}, U = \begin{bmatrix} 1&1&1 \\ 0&1&1 \\ 0&0&1 \end{bmatrix}, b = (4,5,6). Lc = b 에서 c, Ux = c 에서 x 를 구하라. A 는?
      • Lc = b 순방향: c_1 = 4, c_1 + c_2 = 5 \Rightarrow c_2 = 1, c_1+c_2+c_3 = 6 \Rightarrow c_3 = 1c = (4,1,1).
      • Ux = c 역방향: x_3 = 1, x_2 = 0, x_1 = 3x = (3, 0, 1).
      • A = LU = \begin{bmatrix} 1&1&1 \\ 1&2&2 \\ 1&2&3 \end{bmatrix}, 방금 한 것이 정확히 이 A 에 대한 순방향 소거 + 역대입이다.
      • 💡 LU 풀이의 2단계 절차(①Lc=bUx=c)를 손에 익히는 표준 문제.
    • 문제 15 (책 표시: 쉽지만 중요한 문제): A 가 행 교환 없이 피벗 5, 9, 3을 가질 때, 왼쪽 상단 2×2 부분행렬 A_2 의 피벗은?
      • A_2 의 피벗은 5, 9: 앞의 두 피벗 그대로.
      • 이유: A 에 대한 소거는 왼쪽 상단 모서리에서 시작하므로, 처음 두 단계가 곧 A_2 에 대한 소거다 (A_k = L_k U_k).
      • 💡 "모서리 부분행렬이 가역이어야 A=LU 가 가능하다"는 본문 조건의 이유를 그대로 체험하는 문제.