- 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
15 KiB
Executable File
15 KiB
Executable File
deck:: Logseq/전공공부/선형대수학
-
핵심 개념
- 이 절의 요지 3가지:
- ①
n \times n행렬A를U로 바꾸는 소거는 약\frac{1}{3}n^3번의 곱셈과 뺄셈이 필요하다. - ② 우변
b를c로 바꾸는 데는n^2번이면 된다. - ③ 행 교환이 없는 소거는
A를LU로 분해한다 (A = LU의 2가지 증명).
- ①
- 가우스-조르단 소거법 (Gauss-Jordan elimination):
AX = I를 열 단위로 한꺼번에 푸는 방법.- 📌 원문 (p.97): ((6a635ba0-717a-49ea-81c6-1b80acfb2f4c))
- 아이디어:
A^{-1}의k번째 열x_k는Ax_k = e_k의 해다 (e_k는I의k번째 열).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개지만, 그 부산물로 그 행의 나머지 성분들도 전부 새 값으로 갱신된다. 진짜 비용은 여기서 나온다.
- "2행에서 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.
- 💡 2단계와의 연결 (이미 이해한 부분): 2단계는 똑같은 이중 루프를 오른쪽 아래
- ⚠️ 흔한 오해부터: "1단계의 목표는 1열에 0을
- 왜 총합이
\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이 클수록 더 정확해진다.
- 1단계가 끝나면 1행과 1열은 완성. 남은 작업은 오른쪽 아래의
- 왜 우변은
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_n은u_{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^2n = 1{,}000이면\frac{1}{3}n^3 \approx 3.3억 번 vsn^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 \text{의 3행}) = \ell_{31}(U \text{의 1행}) + \ell_{32}(U \text{의 2행}) + 1 \cdot (U \text{의 3행}) \tag{4} - 📌 원문 (식 (4), p.100): 🔗 PDF 위치
- 식 (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을 만나 행 교환이 필요해진다.
- "행 교환이 없고 피벗에 0이 없는
LU를 이용한Ax = b풀이, 두 개의 삼각 시스템A = LU를 알고 나면:Ax = b⟺L(Ux) = b⟺ 두 단계로 분리.- ①
Lc = b를 순방향 대입으로 풀어c를 얻는다 (소거가 우변에 하던 일). - ②
Ux = c를 역대입으로 풀어x를 얻는다.
- ①
- 💡 같은
A에 우변b만 바뀌는 문제를 여러 번 풀 때 진가: 비싼\frac{1}{3}n^3분해는 한 번만, 이후는b마다n^2만 든다.
- 이 절의 요지 3가지:
-
❓ 스스로 점검
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의 주대각선에는 피벗.)
- 주대각선에는 1, 주대각선 아래
- "소거에서 피벗 행에 곱해 빼는 행은
A의 행이 아니라U의 행이다". 왜 이 관찰이A = LU증명의 핵심인가?(U의i행) = (A의i행) - \sum_{j<i} \ell_{ij}(U의j행)을 이항하면(A의i행) = \sum_{j<i}\ell_{ij}(U의j행) + 1\cdot(U의i행), 이것이 정확히 행렬곱LU의i행이기 때문.
- 행 교환 없이
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}.L을Ux_1 = (5,2)에 곱하면 원래 방정식Ax = (5,7)을 되찾는다. 문자로:Ux = c에L을 곱하면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. - 💡 피벗이 "연속된 값의 차"로 나오는 아름다운 패턴. 대칭행렬의 소거가 얼마나 규칙적인지 보여준다.
- 소거하면 모든 승수가 1:
- 문제 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 = 1→c = (4,1,1).Ux = c역방향:x_3 = 1,x_2 = 0,x_1 = 3→x = (3, 0, 1).A = LU = \begin{bmatrix} 1&1&1 \\ 1&2&2 \\ 1&2&3 \end{bmatrix}, 방금 한 것이 정확히 이A에 대한 순방향 소거 + 역대입이다.- 💡
LU풀이의 2단계 절차(①Lc=b②Ux=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가 가능하다"는 본문 조건의 이유를 그대로 체험하는 문제.
- 문제 1 (책 표시: 중요한 문제): 순방향 소거가

