본문 바로가기
programming language/MATLAB

MATLAB 다차원 Newton’s Method

by __observer__ 2015. 9. 30.
반응형

오늘은 아래 포스팅의 Newton's Method 에 대한 연장으로 다차원 Newton's Method 에 대해 소개해 보려 합니다.

http://iamaman.tistory.com/156

  일단 오늘 포스팅에서 참조한 코드는 아래 주소와 같습니다.

 

http://people.whitman.edu/~hundledr/courses/M467/MultiNewton.pdf

 

다음과 같은 수식에 대해 Newton's Method 를 사용하여 해를 구해 보도록 하죠~

 

 

일단 MATLAB 의 solve() 를 사용하여 해를 구해 보면 ~

format long 


syms x1 x2 real 


S = x1^2+x2^2-x1==0;

S1 = x1^2-x2^2-x2==0;


[x1,x2]=solve(S,S1);


x1=double(x1)

x2=double(x2)



 다음과 같이 다음과 같이 두개의 해가 나오는 것을 확인 할 수 있습니다.

 

x1 =

 

0

0.771844506346038

 

x2 =

 

0

0.419643377607081

 

 

(0, 0) 이야 눈으로 봐도 알 수 있는 거고 ~ (0.771844506346038, 0.419643377607081) 를 구하는 게 문제 겠죠~

 

위 링크의 코드를 참조하여 다음과 같이 multinewton.m 파일을 하나 만듭니다. multinewton() 함수가 newton method 를 실행하는 함수이고~ myfunction() 함수가 풀어야 할 수식에 대한 정의 입니다. 편의상 두 함수는 하나의 파일에 정의 했습니다.

 

function x=multinewton(x,NumIters)

[y,dy]=myfunction(x);

for j=1:NumIters

s=dy\y;

x=x-s;

[y,dy]=myfunction(x);

end

 

 

function [y, dy]=myfunction(x)

n=length(x);

y=zeros(size(x)); %Not necessary for a small vector

dy=zeros(n,n); %Not necessary for a small matrix

y(1)=x(1)^2+x(2)^2-x(1);

y(2)=x(1)^2-x(2)^2-x(2);

 

dy(1,1)=2*x(1)-1; % y(1) 을 x(1) 으로 미분

dy(1,2)=2*x(2); % y(1) 을 x(2) 으로 미분

dy(2,1)=2*x(1); % y(2) 을 x(1) 으로 미분

dy(2,2)=-2*x(2)-1; % y(2) 을 x(2) 으로 미분

 

다음으로 위 함수를 사용하여 newton method 를 실행하기 위해 multinewtonSolve.m 파일을 하나 만듭니다.

 

format long

x=[0.7;0.5]; % 초기값

y=multinewton(x, 7) % 두 번째 인자는 실행 횟수

 

물론 파일로 만들지 않고 그냥 Command Windows 에서 실행해도 됩니다.

 

위에서 만든 multinewtonSolve.m 파일을 실행하면~ 다음과 같이 해가 나오는 것을 확인 할 수있으며~ 위에서 solve() 함수를 사용해서 구한 결과와 같다는 것을 확인 할 수 있습니다.

 

>> multinewtonSolve

y =

0.771844506346038

0.419643377607081

 

이번 포스팅에서는 2개의 변수에 대한 Newton Method 에 대해 소개했는데~ 조금만 응용하면 훨씬 더 큰 차원에 대해서도 풀이가 가능할 겁니다.

 

전체 파일 첨부합니다. 실행해 보시길~

multinewtonSolve.m


multinewton.m



반응형

댓글