에듀테크 프로젝트 대시보드
f(x) = 0 이 되는 x(방정식의 근)를 손으로 못 풀 때가 많다. 예를 들어
x⁵ − x − 1 = 0 은 근의 공식이 아예 없다. 뉴턴–랩슨법은 아주 단순한 아이디어로 이걸 푼다 —
대충 찍은 값 x₀ 에서 곡선에 접선을 긋고, 그 접선이 x축과 만나는 점을 다음 후보
x₁ 로 삼는다. 곡선은 접선 근처에서 거의 직선처럼 보이므로, x₁ 은 진짜 근에 훨씬 가까워진다.
이걸 반복하면 맞는 자릿수가 매 단계마다 대략 2배로 늘어난다(2차 수렴). 계산기의 √,
÷, 그래픽스 엔진의 역제곱근, 최적화 solver가 모두 이 방법에 뿌리를 둔다.
√S 는
f(x) = x² − S = 0 의 양의 근이다.
뉴턴 공식에 넣으면 x ← (x + S/x) / 2 —
지금 추정값과 S/추정값의 평균이라는 아주 외우기 쉬운 반복식이 나온다. 나눗셈·평균만으로 √가 계산된다.
| n | xₙ | xₙ² | 오차 |
|---|
def newton(f, df, x, iters=50, tol=1e-12): for n in range(iters): fx = f(x) if abs(fx) < tol: # f(x)가 거의 0 → 근 도착 return x dfx = df(x) if dfx == 0: # 접선이 수평 → x축과 안 만남 (실패) raise ZeroDivisionError x = x - fx / dfx # ★ 접선이 x축과 만나는 점으로 이동 return x # 예: x⁵ - x - 1 = 0 (근의 공식이 없는 5차 방정식) root = newton(lambda x: x**5 - x - 1, lambda x: 5*x**4 - 1, x=1.5) # → 1.1673039782614187 (몇 번 만에 double 정밀도 한계까지) # 도함수 df를 못 구하면 → 割線法(secant): 두 점을 잇는 직선으로 근사 # x2 = x1 - f(x1)*(x1 - x0) / (f(x1) - f(x0))
eₙ₊₁ ≈ C·eₙ². 맞는 자릿수가 3 → 6 → 12 → … 로 배가된다. 이분법(bisection)은 한 번에 자릿수가 약 0.3개씩만 는다.f(x) 와 도함수 f'(x), 그리고 근에 충분히 가까운 시작값.| 상황 | 무슨 일이 벌어지나 | 대처 |
|---|---|---|
| f'(x) = 0 (극값) | 접선이 수평이라 x축과 안 만남 → 다음 값이 무한대로 튐 | 시작값 바꾸기 |
| 변곡점 근처 진동 | x₀, x₁, x₀, x₁ … 두 값을 오가는 2-사이클에 갇힘 (예: x³−2x+2, x₀=0) | 감쇠(damped) 뉴턴 |
| 먼 시작값 | 가까운 근을 지나쳐 다른 근으로 수렴 — "뉴턴 프랙탈"의 원인 | 이분법으로 좁힌 뒤 전환 |
| 근에서 f'=0 (중근) | 여전히 수렴하지만 속도가 1차로 느려짐 | 중복도 m 곱하기 |
| 도함수가 비쌈/불가 | 매 반복마다 f' 계산이 부담 | 割線法·준뉴턴(BFGS) |
x² − 2 에서 x₀ = 0 을 주면 f'=0 발산을 직접 볼 수 있다.| 이분법 | 뉴턴–랩슨법 | |
|---|---|---|
| 필요 정보 | 부호가 다른 두 점 [a,b] | f(x), f'(x), 시작값 1개 |
| 수렴 속도 | 1차 (매번 구간 절반) | 2차 (자릿수 배가) |
| √2 를 12자리까지 | 약 40 회 | 약 5 회 |
| 수렴 보장 | 항상 (구간만 맞으면) | 아니오 (시작값에 민감) |
| 도함수 | 필요 없음 | 필요 |