수치해석학에서 뉴턴 방법(영어: Newton's method)은 실숫값 함수의 영점을 근사하는 방법의 하나이다.
뉴턴-랍슨 방법(영어: Newton–Raphson method)이라고도 불린다.
정의
연속 미분 가능 함수 가 영점 를 갖는다고 하자. 또한, 라고 하자. 그렇다면, 다음을 만족시키는 열린집합 가 존재한다.
임의의 에 대하여, 수열 ()은 로 수렴한다.
이를 통해 영점 를 근사하는 방법을 뉴턴 방법이라고 한다. 반복 계산을 정지하기 위한 정지조건은 할선법에서 사용된 것 중 하나가 쓰인다.[1] 뉴턴 방법은 매우 효과적인 방법이지만 초기 가정치 를 근에 충분히 가깝게 하지 않으면 수렴하지 않는다는 단점이 있다. 또한 접선이 거의 수평인 즉 인 를 선택해선 안 된다.[2]
성질
오차
만약 가 2번 연속 미분 가능 함수라면, 점렬의 항과 영점 사이의 오차에 대하여 다음을 만족시키는 상수 가 존재한다.
점렬의 단조성
만약 가 2번 연속 미분 가능 함수라면,
만약 임의의 에 대하여 라면, 은 증가 수열이다.
만약 임의의 에 대하여 라면, 은 감소 수열이다.
예제
루트값 구하기
x2 = a를 만족하는 양수 x를 구해서 결국 a의 루트값을 구해보자. 뉴튼방법은 루트값을 구하는 여러 가지 계산법 중에 하나이다. 루트를 구하는 이 문제를 다음과 같이 함수 f(x) = x2 − a의 해를 구하는 문제로 생각할 수 있다. 1차 미분은 f′(x) = 2x로 주어진다.
612의 루트값을 계산하는 경우를 다뤄보자. 초기값을 x0 = 10로 하고, 뉴튼법을 적용하면 다음과 같다:
여기서 참값과 같은 부분의 숫자는 밑줄이 그어져있다. 많지 않은 몇번의 반복을 통해 매우 정확한 루트값이 계산되는 것을 볼 수 있다.
즉, 루트를 구하는 뉴튼법은 결국 현재 추측한 루트값의 xn 과 a/xn의 산술_평균을 반복적으로 적용한 것이다.
cos(x) = x3의 해 구하기
cos(x) = x3을 만족하는 x를 구하는 문제를 생각해보자. 이 문제는 f(x) = cos(x) − x3이 0이 되는 해를 찾는 문제로 바뀔 수 있다. 1차 미분은 f′(x) = −sin(x) − 3x2로 주어진다. 모든 x에 대해 cos(x) ≤ 1 이고 x > 1에 대해 x3 > 1이므로, 이 함수가 0이되는 구간은 0과 1사이라는 것을 알 수 있다.
초기 추정해를 x0 = 0.5라 하고 뉴튼방법을 적용하면 (초기값을 0으로 선택하면 미분값이 0이 되고, 0으로 나누기 연산을 해서 계산이 실패한다. 즉, 무한대값이 발생한다. 뉴튼방법에서 초기값 선택은 해로 수렴하는데 큰 영향을 미친다) 아래와 같은 결과를 얻는다:
여기서 참값과 같은 부분의 숫자는 밑줄이 그어져있다. 구해진 x6값은 소숫점아래 12자리까지 참값과 같다. 위의 계산예에서 2자리까지 참값과 일치하는 x3가 이어지는 계산에서 5자리, 10자리로 일치하는 이차수렴(quadratic convergence)속도를 보이는 것을 알 수 있다.
프로그램
아래 프로그램은 뉴튼방법을 쥴리아 언어로 구현한 것으로 미분값 fprime을 갖는 함수 f의 근을 구한다.
뉴튼 방법이 매번 반복될 때마다 갱신되는 값은 x1이다. 반복 계산할 때마다 분수의 나눠지는 분모부분이 (yprime) 너무 작아지지 않는지 (epsilon보다 더 작아지지 않는지) 확인한다. 즉, f′(xn) ≈ 0이 발생하면 큰 수치오차가 발생한다.
x0=1# The initial guessf(x)=x^2-2# The function whose root we are trying to findfprime(x)=2x# The derivative of the functiontolerance=1e-7# 7 digit accuracy is desiredepsilon=1e-14# Do not divide by a number smaller than thismaxIterations=20# Do not allow the iterations to continue indefinitelysolutionFound=false# Have not converged to a solution yetfori=1:maxIterationsy=f(x0)yprime=fprime(x0)ifabs(yprime)<epsilon# Stop if the denominator is too smallbreakendglobalx1=x0-y/yprime# Do Newton's computationifabs(x1-x0)<=tolerance# Stop when the result is within the desired toleranceglobalsolutionFound=truebreakendglobalx0=x1# Update x0 to start the process againendifsolutionFoundprintln("Solution: ",x1)# x1 is a solution within tolerance and maximum number of iterationselseprintln("Did not converge")# Newton's method did not convergeend