Newton-Raphson 방법으로 근을 구하는 Matlab 함수

기계시스템디자인공학과 김성환 교수

(1) [eqn: f(x)=x ^{2} -9=0] 의 근 구하기

[eqn: x _{0}] 의 초기값으로부터 [eqn: x _{i+1} =x _{i} - {f(x _{i} )} over {f prime (x _{i} )}] 를 반복.
상대근사오차 [eqn: epsilon _{a} = LEFT | {x _{"new"} -x _{old}} over {x _{"new"}} RIGHT | TIMES 100] 가 허용오차 [eqn: epsilon _{s}]보다 작아지면 반복 종료

(2) [eqn: f(x)=x ^{2} -9=0] 의 근을 구하기 위해 그래프를 그려 개형을 알아봄

- 2개의 근이 있음 (-3 과 3)

- 양의 근을 구하기 위해서는 초기값으로 양수값 사용

- 음의 근을 구하기 위해서는 초기값으로 음수값 사용

>> fplot(@(x)x^2-9, [-5 5]); grid

(3) 함수값 및 도함수값의 계산을 코드에 포함

function root = nr( xr )

while(1)

xrold = xr;

f = xr^2-9;

df = 2*xr;

dx = f / df;

xr = xr - dx;

%disp(xr);

ea = abs( (xr-xrold)/xr ) * 100;

if ea <= 1.e-6

break;

end

end

root = xr;

end

>> nr(10)   초기값을 20, 50, 200, 2000 으로 늘려보기

(4) 반복 횟수를 리턴

function [root, niter] = nr( xr )

niter = 0;

while(1)

xrold = xr;

f = xr^2-9;

df = 2*xr;

dx = f / df;

xr = xr - dx;

%disp(xr);

niter = niter + 1;

ea = abs( (xr-xrold)/xr ) * 100;

if ea <= 1.e-6

break;

end

end

root = xr;

end

>> [root niter] = nr(10)   초기값을 20, 50, 200, 2000 으로 늘려보기

(5) 함수와 도함수를 부함수로 계산 - 내포화

function [root, niter] = nr( xr )

niter = 0;

while(1)

xrold = xr;

dx = func(xr) / dfunc(xr);

xr = xr - dx;

%disp(xr);

niter = niter + 1;

ea = abs( (xr-xrold)/xr ) * 100;

if ea <= 1.e-6

break;

end

end

root = xr;

end

function f = func(x)

f = x^2 - 9;

end

function df = dfunc(x)

df = 2 * x;

end

>> [root niter] = nr(10)   초기값을 20, 50, 200, 2000 으로 늘려보기

(6) 함수, 도함수를 외부에서 인수로 입력

function [root, niter] = nr( func, dfunc, xr )

niter = 0;

while(1)

xrold = xr;

dx = func(xr) / dfunc(xr);

xr = xr - dx;

%disp(xr);

niter = niter + 1;

ea = abs( (xr-xrold)/xr ) * 100;

if ea <= 1.e-6

break;

end

end

root = xr;

end

>> [x niter] = nr(@(x)x^2-9, @(x)2*x, 10)

▢