실습 · 연습문제 2개
이분법으로 근 찾기 bisection-root
연속함수 가 구간 의 양 끝에서 부호가 다르면() 중간값 정리에 따라 그 사이에 근이 있다. 이분법(bisection)은 중점 에서 부호를 확인해, 부호가 바뀌는 쪽 절반을 남기는 일을 반복한다. 구간 폭이 매번 절반이 되므로 느리지만, 부호가 바뀌는 구간만 주어지면 반드시 수렴한다.
함수 bisection(f, a, b, xtol=1e-12, max_iter=200)를 완성한다.
- 와 의 부호가 같으면
ValueError를 낸다. 둘 중 하나가 정확히 0이면 그 끝점을 바로 반환한다(반복 0번). - 구간 폭 가
xtol이하가 되면 멈추고 중점을 반환한다. 그러면 반환값과 근의 거리가xtol이하임이 보장된다. 중점에서 이면 바로 을 반환한다. (x, n_iter)를 반환한다.n_iter는 구간을 절반으로 줄인 횟수다.max_iter번 안에 끝나지 않으면 그때의 중점을 반환한다.
힌트: 구간 에서 번 절반으로 줄이면 폭은 다. 테스트는 반복 횟수가 이 식에서 예측한 값과 같은지도 확인한다. 부호 비교는 f(a) * f(m) 대신 np.sign으로 하면 아주 큰 값·작은 값의 곱이 overflow·underflow하는 것을 피할 수 있다(9.1장).
damped Newton으로 연립방정식 풀기 damped-newton
비선형 연립방정식 ()의 Newton step은 Jacobian 에 대한 선형시스템
의 해다. 순수 Newton은 로 가지만, 근에서 멀면 step이 너무 커서 발산할 수 있다. damped Newton은 step 길이 을 줄여 가며
를 만족하는 첫 (1, 1/2, 1/4, …)를 쓴다(backtracking line search).
함수 damped_newton(F, J, x0, tol=1e-10, max_iter=50)를 완성한다.
F(x)는 shape(n,),J(x)는 shape(n, n)을 반환한다.- 매 반복의 처음에
tol이면 멈춘다. - Newton step은
np.linalg.solve로 구한다. 역행렬을 만들지 않는다. - 는 1에서 시작해 조건을 만족할 때까지 절반으로 줄인다. 이 되도록 만족하지 않으면 그 로 그냥 진행한다.
(x, n_iter)를 반환한다.n_iter는 수행한 Newton step의 수다.
테스트는 순수 Newton이 발산하는 초기값에서 damped Newton이 수렴하는지, 근 근처에서 몇 번 만에 끝나는지(2차 수렴)를 확인한다.