-
[부록] 뉴턴랩슨법 구현Data Science/부록 2020. 10. 23. 22:58반응형
뉴턴-랩슨법(Newton's Method)을 구현해보려고 합니다.
뉴턴-랩슨법이 무엇인지는 이전 글을 참고해주세요.
파이썬으로 간단하게 구현을 했는데요,
여기서 구하고자 하는 $f(x) = x^{2} + 8x - 17$입니다.
구해보면 이 때의 해 $x$는 $1.7445626$이 나옵니다.
$f(x) = 0$을 만들어주는 $x$를 구해보기 위해 근의 공식에 대입하면, $x = -4 \pm \sqrt{33}$이 나옵니다.
$\sqrt{33} = 5.74456264654$이니, 실제로도 정확하게 구해주네요.
코드는 아래와 같습니다.
def ftn(x): z = x*x + 8*x - 17 return(z) xt = 100 h = 0.000000001 epsilon = 0.0000001 i = 1 while 1 == True: ftn_drv = (ftn(xt+h) - ftn(xt-h))/ (2*h) xt1 = xt - ftn(xt)/ftn_drv dist = abs(xt1 - xt) if dist <= epsilon : break else : xt = xt1 i += 1 print("%s / %s / %s" %i, xt1, ftn(xt1)) # 9 / 1.7445626465380286 / 0.0
참고로, 여기서
h
와epsilon
이 나오는데 각각 목적이 다릅니다.h
는 미분때문에 정한 값입니다.여기서는 대상함수로 $f(x) = x^{2} + 8x - 17$로 정했지만, 실제로 우리는 함수식이 모르는 경우도 있어요.
그리고 함수식을 안다고 해도, 미분하기가 어려운 경우도 있습니다.
이럴 때는 수치적 방법(Numerical Method)을 사용합니다.
쉽게 말해 굳이 도함수를 구하지 않고, 계산해내겠다는 겁니다.
미분가능한 함수 $f(x)$에 대해 도함수는 다음과 같이 정의됩니다.
$$\lim_{h \to 0}\frac{f(x+h) - f(x)}{h} = f'(x)$$
이때 $h$가 0으로 간다는 의미로서 충분히 작은 $h$를 정해주면 실제 미분값과 대략적으로 비슷하게 구할 수 있습니다.
오차가 크지만 않으면 논리를 전개하는 데에 무리는 없을 거에요.
그래서 미분을 구하기 어렵거나 계산이 까다로워 지는 경우 이러한 방법을 사용합니다.
다만 여기서는 아래 식을 사용했습니다.
$$ \lim_{h \to 0}\frac{f(x+h) - f(x-h)}{2h} = f'(x) $$
epsilon
의 경우는 조금 다릅니다.우리가 원하는 대로 함수값을 아주 정확하게 0으로 만들어주는 해를 구할 수 있다면 좋을 거에요.
하지만 해(Solution)가 무리수라면, 컴퓨터가 어떤 값을 넣어도 함수값이 0이 될 수는 없을 거에요.
컴퓨터 능력이 아무리 좋아도 넣을 수 있는 값은 '해에 매우 근접한 유리수'일테니까요.
따라서 어느 정도 수준에 이르면 계산을 멈출 필요가 있습니다.
이 정도면 '적당히 0과 같다' 또는 '이 정도의 오차는 괜찮다'는 수준을 정해둘 필요가 있어요.
이 차이를
epsilon
으로 정의했으니, 코드를 보실 때 잘 구분해 주세요.반응형'Data Science > 부록' 카테고리의 다른 글
[부록] 최소제곱법 공식 유도② 단순회귀모형 (0) 2020.10.17 [부록] 최소제곱법 공식 유도① 다중회귀모형 (0) 2020.09.10