docs: 2.4 부분피벗이 큰 피벗을 고르는 이유 상세 보강
- 논리 사슬: 작은 피벗 → 큰 승수(피벗이 분모) → 자릿수 소실 + 오차 증폭 - 유효숫자 3자리 가정의 파국 예제 (x=0 오답 vs 행 교환 후 정답) 추가 - 최대 피벗 선택 → |ℓ|≤1 보장 → 증폭 원천 차단 설명 - "L의 성분이 1 이하" = "모든 승수가 1 이하"의 동어반복임을 명시 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01G8rNxLqi5rYjRamC8uwiJW
This commit is contained in:
parent
78c2df5de6
commit
82590cbd74
@ -27,11 +27,26 @@ deck:: Logseq/전공공부/선형대수학
|
||||
- 예 (p.107): 2행↔3행을 먼저 바꾸면 $PA$ 는 피벗 0을 만나지 않고 곧장 $LU$ 로 분해된다.
|
||||
- 💡 원래 행렬에 열 $(1,2,3)$ 을 추가로 붙여두면 행 교환이 어떻게 일어났는지 추적된다 (다니엘 드러커의 방법) — 마지막에 그 열을 읽으면 $P$ 를 알 수 있다.
|
||||
- **부분피벗** (partial pivoting) — 반올림 오류를 줄이는 실전 기법
|
||||
- **작은 피벗 값은 (수치적으로) 안전하지 않다.** 좋은 코드는 같은 열에서 아래에 더 큰 수가 있으면 행을 교환해 **가장 큰 수를 피벗으로** 선택한다.
|
||||
- 배경: 컴퓨터는 수를 **유한한 유효숫자**(부동소수점, 보통 약 16자리)로 저장한다. 연산할 때마다 결과가 반올림되므로 매 단계 작은 오차가 생기고, 문제는 소거 과정이 이 오차를 **증폭시킬 수 있다**는 것이다.
|
||||
- **왜 작은 피벗이 위험한가 — 논리 사슬**:
|
||||
- ① 소거에서 실제로 곱해지는 수는 피벗이 아니라 **승수** $\ell = \dfrac{\text{지울 성분}}{\text{피벗}}$ 이다. **피벗이 분모**이므로, 피벗이 작을수록 $\ell$ 은 커진다 (피벗 $0.0001$ → $\ell = 10000$ 같은 식).
|
||||
- ② 행 갱신은 (아래 행) − $\ell$ × (피벗 행) 이다. $\ell$ 이 거대하면 빼는 쪽 $\ell \times$(피벗 행)이 원래 행보다 수만 배 커진다 → 뺄셈 결과에서 **원래 행이 갖고 있던 정보가 큰 수의 반올림 자릿수 아래로 쓸려 내려가 사라진다** (자릿수 소실).
|
||||
- ③ 게다가 피벗 행에 이미 있던 작은 반올림 오차도 $\ell$ **배로 곱해져 증폭**된다. $\ell = 10^4$ 이면 오차도 $10^4$ 배.
|
||||
- 요약: 작은 피벗 → 큰 승수 → 큰 수끼리의 뺄셈 → 정보 소실 + 오차 증폭.
|
||||
- **파국의 수치 예** — 유효숫자 3자리 컴퓨터를 가정하고 다음을 풀어보자 (참해는 $x \approx 1.0001$, $y \approx 0.9999$):
|
||||
- $$0.0001x + y = 1 \qquad x + y = 2$$
|
||||
- **교환 없이** (피벗 $0.0001$): $\ell = \dfrac{1}{0.0001} = 10000$. 2행 갱신: $y$ 계수는 $1 - 10000 = -9999$, 우변은 $2 - 10000 = -9998$ — 그런데 3자리 컴퓨터는 둘 다 $-1.00 \times 10^4$ 로 반올림한다 ("$1$"과 "$2$"라는 정보가 통째로 소실!). 그러면 $y = 1.00$, 역대입에서 $0.0001x = 1 - 1.00 = 0$ → $x = 0$. **참값 $x \approx 1$ 인데 $0$ 이 나왔다 — 100% 오답.**
|
||||
- **행 교환 후** (피벗 $1$): $x + y = 2$ 를 위로. $\ell = \dfrac{0.0001}{1} = 0.0001$. 1행 갱신: $(1 - 0.0001)y = 1 - 0.0002$ → 3자리로 $1.00\,y = 1.00$ → $y = 1.00$, $x = 2 - 1.00 = 1.00$. **3자리 정밀도 안에서 정확하다.**
|
||||
- 💡 행렬은 특이행렬 근처도 아니고 문제 자체는 멀쩡하다 — 순전히 **피벗 선택** 때문에 결과가 0점과 100점으로 갈렸다.
|
||||
- **왜 "가장 큰 수"를 피벗으로 고르면 해결되는가**:
|
||||
- 같은 열에서 절댓값이 가장 큰 수를 피벗으로 올리면, 모든 승수가 $\ell = \dfrac{\text{지울 성분}}{\text{피벗}}$ 에서 분자 ≤ 분모가 되어 **항상 $|\ell| \le 1$** 이 보장된다.
|
||||
- 📌 원문 (p.107): ((6a635d42-c493-49c3-be5e-3a661e755e22))
|
||||
- 각 피벗을 그 아래의 모든 수보다 크게 만들면, $L$ 의 모든 성분(승수)은 1 이하가 된다 → 계산이 안정적.
|
||||
- $|\ell| \le 1$ 이면: 곱해서 빼는 양이 원래 행과 비슷한 크기 → 자릿수 소실이 없고, 기존 오차도 곱셈으로 **커지지 않는다** (1 이하를 곱하면 같거나 작아질 뿐). 위 사슬 ②③이 원천 차단된다.
|
||||
- **"$L$ 의 성분이 1 이하"의 뜻** — 어려운 말이 아니다:
|
||||
- [[2.3 행렬 계산과 A = LU]]에서 봤듯 $L$ 의 주대각선 아래 성분들은 **정확히 승수 $\ell_{ij}$ 들**이다. 그러니 "부분피벗을 하면 $L$ 의 모든 성분이 1 이하"라는 문장은 = "**모든 단계의 승수가 $|\ell| \le 1$**"의 다른 표현일 뿐이다.
|
||||
- 📌 원문 (p.107): ((6a635d3f-54ac-451b-9c25-98e20dfdc20f))
|
||||
- ⚠️ 수학적으로는 0만 아니면 피벗이 될 수 있지만, 컴퓨터에서는 **크기**가 중요하다 — "필요한 교환"과 "안전을 위한 교환"을 구분할 것.
|
||||
- 즉 완성된 $L$ 을 보면 그 소거가 수치적으로 안전했는지 한눈에 보인다 — 성분이 전부 1 이하면 오차를 증폭시킨 단계가 하나도 없었다는 증거다.
|
||||
- ⚠️ 수학적으로는 0만 아니면 피벗이 될 수 있지만, 컴퓨터에서는 **크기**가 중요하다 — "필요한 교환"(피벗이 0일 때, 수학적 필수)과 "안전을 위한 교환"(피벗이 작을 때, 수치적 선택)을 구분할 것. 부분피벗은 후자다.
|
||||
- $PAQ$ **— 행 치환과 열 치환**: 왼쪽 곱 $PA$ 는 **행** 순서를, 오른쪽 곱 $AQ$ 는 **열** 순서를 바꾼다. 행 6가지 × 열 6가지 = 3×3 행렬 하나에 36개의 서로 다른 $PAQ$.
|
||||
- **전치행렬 (transpose)** $A^{\mathrm{T}}$ **의 정확한 형태** 🧩
|
||||
- $A^{\mathrm{T}}$ 의 열은 $A$ 의 행이다. $A$ 가 $m \times n$ 이면 $A^{\mathrm{T}}$ 는 $n \times m$.
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user