9.2 조건수·안정성·수렴

실습 · 연습문제 2개

오차 수열에서 수렴 차수 추정하기 convergence-order

반복법의 오차 ek=∣xk−x∗∣e_k = |x_k - x^*|가

ek+1≈C ek pe_{k+1} \approx C\, e_k^{\,p}

를 따르면 수렴 차수(order of convergence)가 pp다. p=1p = 1이면 선형 수렴, p=2p = 2이면 2차 수렴이다. 연속한 세 오차에서 CC를 소거하면

pk=log⁡(ek+1/ek)log⁡(ek/ek−1)p_k = \frac{\log(e_{k+1} / e_k)}{\log(e_k / e_{k-1})}

로 pp를 추정할 수 있다.

함수 estimate_order(errors)를 완성한다.

  • errors는 양수 오차의 1차원 배열 (e0,e1,…,en−1)(e_0, e_1, \dots, e_{n-1})이다(n≥3n \ge 3).
  • k=1,…,n−2k = 1, \dots, n-2에 대한 추정값 pkp_k를 담은 길이 n−2n - 2의 NumPy 배열을 반환한다.

테스트는 선형 수렴(ek=0.5ke_k = 0.5^k), 2차 수렴(ek+1=ek2e_{k+1} = e_k^2), 실제 Newton 반복과 secant 반복의 오차에 적용해 추정값을 확인한다.

참고: 실제 반복에서 오차가 machine epsilon 근처까지 줄면 반올림 오차 때문에 추정값이 흔들린다. 추정값은 오차가 충분히 크고 점근 영역에 들어선 구간에서 읽는다.

이차방정식의 안정한 근 stable-quadratic-roots

ax2+bx+c=0ax^2 + bx + c = 0의 근의 공식

x1,2=−b±b2−4ac2ax_{1,2} = \frac{-b \pm \sqrt{b^2 - 4ac}}{2a}

은 ∣b∣|b|가 ∣ac∣|ac|보다 훨씬 크면 한 근에서 거의 같은 두 수 −b-b와 ±b2−4ac\pm\sqrt{b^2-4ac}를 빼게 되어 유효숫자를 잃는다. 근 자체는 계수의 작은 변화에 둔감한(조건이 좋은) 문제인데도, 알고리즘이 불안정해서 생기는 오차다.

함수 quadratic_roots(a, b, c)를 완성한다.

  • 실근 두 개를 작은 것부터 정렬한 튜플 (x1, x2)로 반환한다. 테스트는 a≠0a \neq 0이고 b2−4ac>0b^2 - 4ac > 0인 경우만 넣는다.
  • 두 근 모두 상대 오차가 10−1410^{-14} 이하여야 한다. 예: x2−108x+1=0x^2 - 10^8 x + 1 = 0의 작은 근은 약 10−810^{-8}이다.
  • b=0b = 0이어도 동작해야 한다.

힌트: 부호가 같은 두 수를 더하는 쪽의 근을 먼저 구한다. q=−12(b+sign⁡(b)b2−4ac)q = -\tfrac{1}{2}\big(b + \operatorname{sign}(b)\sqrt{b^2 - 4ac}\big)로 두면 x=q/ax = q/a가 한 근이고, 근과 계수의 관계(Vieta) x1x2=c/ax_1 x_2 = c/a에서 다른 근은 c/qc/q다. np.sign(0)은 0이므로 b=0b = 0일 때의 부호를 따로 정한다.