공학/수치해석

[수치해석] 뉴턴-랩슨(Newton-Raphson)법 (with Python)

슬기나무 2020. 12. 6. 16:30
반응형

이번 포스팅에서는 Newton-Raphson법에 대해 알아보도록 합시다.

 

 뉴턴-랩슨(Newton-Raphson)법 개요

뉴턴-랩슨법이란

 

미분가능한 함수 f(x)의 해를 수치적으로 접근하여

 

근사해(solution)을 구할 수 있게 해주는 방법입니다.

 

이와 같이 수치해석을 통해 근사해를 구하는 이유 중 가장 큰 이유는

 

컴퓨터를 이용하여 연산하기 위해서일 것입니다.

 

컴퓨터는 exact solution을 구하지 못하니까요!

 

 해를 구하는 과정 및 공식

뉴턴 랩슨법을 그림으로 간략하게 설명드리죠!

 

여기서 하는 일련의 행위는 궁극적으로

 

exact solution (c,0)에 가장 가까운 근사해(solution)를 찾기 위함입니다.

 

Newton-Raphson법에서 해를 찾는 과정

우선 해를 구하려는 함수 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) 반복

 

이를 식으로 나타내면 아래와 같이 나타낼 수 있습니다.

 

Newton-Raphson법

 

 예시 (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))

 

초기값 x_init을 -5로 입력했을 때(좌), +5로 입력했을 때(우)

 

python 코드와 결과를 함께 나타내었습니다.

 

초기값이 무엇이냐에 따라 같은 방정식인데도 결과는 다르게 나옵니다.

 

 결과가 다르게 나오는 이유 & 주의할 점

초기값에 따른 결과의 차이

두 결과가 서로 다른 이유는 위 그림을 예로 들 수 있습니다.

 

허용오차보다 작은 함수값이 나올 때 까지 반복하며 해를 찾아주는 알고리즘이다보니,

 

하나의 해를 찾고나면 멈춥니다.

 

따라서 초기값 -5에서 시작한 경우 -2인 해를 찾고나서 알고리즘은 멈추고,

 

반대로 +5에서 시작한 경우는 +2를 찾고나서 멈추게 되죠.

 

결과적으로는 초기값에 따라 서로 다른 근사해를 찾아줄 수도 있고,

 

경우에 따라 뉴턴-랩슨법은 발산하는 경우도 있습니다.

 

따라서 초기값 설정이 매우 중요합니다.

 

 

여기까지 뉴턴-랩슨(Newton-Raphson)법에 대해 알아보았습니다.

반응형