수학 & 코딩 – 뉴턴의 방법으로 근삿값 구하기

구하고자 하는 값이 a일 때, a의 근삿값을 구해보겠습니다.

일단 아래 그림과 같이 f(a)=0을 만족하는 함수 : [f(x)]를 그립니다.

뉴턴의 방법은 위 함수에서 x값이 x0에서 a가 될 때까지 업데이트하는 것입니다.
즉 f(x)=0이 될 때까지 x를 계속 업데이트를 하는 것입니다.

그러기 위해 f(xn)에 접하는 식인 y=f’(x­n)(x-xn)+f(xn)을 구하고 xn+1식을 유도합니다.

xn+1은 f’(x­n)(x-xn)+f(xn)=0일 때의 x값입니다.
따라서 xn+1=xn-f(xn)/f’(xn)을 만족합니다.

이제 xn+1이 a가 될 때까지(f(xn+1)=0이 될 때까지) 위 식을 반복해서 풀면 됩니다.
ex) x1=x0-f(x0)/f’(x0), f(x1)!=0 -> x2=x1-f(x1)/f’(x1), f(x2)=0 -> x2=answer

이번에는 이 개념을 이용해서 루트a에 대한 근사치를 구해보겠습니다.

f(루트a)=0인 f(x)에 대해서 f(x)=0을 만족하는 x­­n+1을 찾으면 됩니다.

구하고자 하는 값이 루트a이면 x­­n+1은 아래 식으로 일반화할 수 있습니다.

근사치는 아래의 파이썬 코드로 구할 수 있습니다.

import math
def approximate_root(a):
    x=a-1
    while True:
        print(x)
        y=(x+a/x)/2
        if y==x:
            return y
        x=y
approximate_root(4)

x는 xn이라고 생각하면 됩니다.
초기 xn은 a-1로 설정하였습니다.

y는 xn+1이라고 생각하면 됩니다.
y값을 구했으면 y(xn+1)값을 x(xn)에 저장합니다. [ xn <- xn+1 ]

xn+1이 더 이상 업데이트가 안 될 때(xn+1=x­n)까지 업데이트를 하면 f(x)=0을 만족하는 해를 찾았다는 의미가 됩니다.

하지만 float형 계산을 하는데 equal 연산을 사용하는 것은 위험합니다.
컴퓨터는 무한 소수들을 정확하게 표현할 수 없기 때문입니다. (부동 소수점 오차가 존재)
즉 값이 다른데도 불구하고 같다고 처리할 우려가 있는 것이죠.

x와 y가 정확하게 같은지 여부를 확인하는 대신 내장 함수 abs를 사용해 ‘두 수의 차에 대한 절댓값’만 계산하는 것이 더 안전합니다.

import math
epsilon=1e-6
def approximate_root(a):
    x=a-1
    while True:
        print(x)
        y=(x+a/x)/2
        if abs(y-x) <epsilon:
            return y
        x=y
print(approximate_root(4))

따라서 ‘엡실론’이란 것을 이용했습니다.
‘엡실론’은 0과 아주 근접한 수입니다.

y(xn+1)와 x(xn)의 차이가 ‘엡실론’이하일 때 근사치를 구했다고 판정할 수 있습니다.

한 번 a=4, x=3으로 두고 루트4에 대한 근사치를 구해보겠습니다.

One thought on “수학 & 코딩 – 뉴턴의 방법으로 근삿값 구하기

Leave a Reply

Your email address will not be published. Required fields are marked *