이번 포스팅에서는 Newton-Raphson법에 대해 알아보도록 합시다.
뉴턴-랩슨(Newton-Raphson)법 개요
뉴턴-랩슨법이란
미분가능한 함수 f(x)의 해를 수치적으로 접근하여
근사해(solution)을 구할 수 있게 해주는 방법입니다.
이와 같이 수치해석을 통해 근사해를 구하는 이유 중 가장 큰 이유는
컴퓨터를 이용하여 연산하기 위해서일 것입니다.
컴퓨터는 exact solution을 구하지 못하니까요!
해를 구하는 과정 및 공식
뉴턴 랩슨법을 그림으로 간략하게 설명드리죠!
여기서 하는 일련의 행위는 궁극적으로
exact solution (c,0)에 가장 가까운 근사해(solution)를 찾기 위함입니다.
우선 해를 구하려는 함수 f(x)에 대하여 그에 대한 미분 f'(x)를 알 수 있어야 합니다.
(1) f(x)의 (a,f(a))점에서의 접선의 기울기를 갖는 f'(x)의 x 절편 (b,0)를 찾는다.
(2) b에서의 함수값 f(b)가 0에 근접한지 판단한다: 허용오차(error) 판단
(3) 만약 허용오차 안이라면 근사해(solution)으로 채택,
(4) 허용오차 밖이라면 (b,f(b))점에서 다시 미분하여 (1)~(3) 반복
이를 식으로 나타내면 아래와 같이 나타낼 수 있습니다.
예시 (Python code)
그럼 이론을 알았으니 예제 한문제만 풀어볼까요?
아래 2차 방정식이 있습니다.
뉴턴-랩슨법을 사용하기 위해 도함수도 구해봅시다.
이제 준비는 다 되었습니다.
방정식이 워낙 쉬운 형태여서
우리는 이 방정식이 -2, +2의 두 해를 가진다는 것을 이미 알고 있습니다.
실제로 나오는지 한번 구해보죠.
import sympy as sp
x = sp.symbols('x')
f_x = x**2 - 4
fp_x = sp.diff(f_x)
x_init = 5
Tolerance = 1e-6
x_tmp = x_init
i = 0
while True:
i = i + 1
x_numeric = float(x_tmp) - float(f_x.subs(x,x_tmp))/float(fp_x.subs(x,x_tmp))
NR_error = f_x.subs(x, x_numeric)
if NR_error <= Tolerance:
break
x_tmp = x_numeric
print('반복 횟수: '+ str(i))
print('근사해: '+ str(x_numeric))
python 코드와 결과를 함께 나타내었습니다.
초기값이 무엇이냐에 따라 같은 방정식인데도 결과는 다르게 나옵니다.
결과가 다르게 나오는 이유 & 주의할 점
두 결과가 서로 다른 이유는 위 그림을 예로 들 수 있습니다.
허용오차보다 작은 함수값이 나올 때 까지 반복하며 해를 찾아주는 알고리즘이다보니,
하나의 해를 찾고나면 멈춥니다.
따라서 초기값 -5에서 시작한 경우 -2인 해를 찾고나서 알고리즘은 멈추고,
반대로 +5에서 시작한 경우는 +2를 찾고나서 멈추게 되죠.
결과적으로는 초기값에 따라 서로 다른 근사해를 찾아줄 수도 있고,
경우에 따라 뉴턴-랩슨법은 발산하는 경우도 있습니다.
따라서 초기값 설정이 매우 중요합니다.
여기까지 뉴턴-랩슨(Newton-Raphson)법에 대해 알아보았습니다.
'공학 > 수치해석' 카테고리의 다른 글
[수치해석] Gaussian elimination(가우스 소거법) (0) | 2021.07.28 |
---|---|
[수치해석] Cramer's rule (크래머 공식) (0) | 2021.07.27 |
[수치해석] 사다리꼴 공식(trapezoidal rule) (2) | 2021.04.15 |
[수치해석] Newmark method(뉴마크 기법) (0) | 2021.04.11 |
[수치해석] Runge-kutta method(룽게-쿠타법) (with MATLAB) (8) | 2020.12.07 |