본문 바로가기
programming language/MATLAB

MATLAB 다차원 Newton’s Method

by 남성 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



댓글4

  • 공돌이 2015.12.10 00:31

    매트랩 공부를 하다가 찾게 되었습니다.
    제가 질문할 내용은 뉴턴 랩슨법에 관해서가 아니지만 질문 할수 있는 방법이 없어서 이렇게 질문합니다.
    라그랑지안 승수법을 사용하여 문제를 푸는 전력 경제급전(economic dispatch)입니다.
    0.3<=P1<=1.5,0.5<=P2<=2
    C1(Pg1)=0.002*Pg1^2+8*Pg1+500
    C2(Pg2)=0.001*Pg2^2+7*Pg2+400
    라그랑지안 함수L=C+x*(-Pg) (x=lambda)를 Pg에 관하여 미분하여 lambda를 구하는 문제입니다.
    제가 궁굼한 것은 라그랑지안 함수 지정 및 lambda지정을 어떻게 해야하는지를 모르겠어서 질문 올립니다.
    감사합니다!
    답글

  • 공순이 2016.05.09 17:45

    안녕하세요. 매트랩 solve 명령어에 대해서 검색하다가 들어오게되었습니다.
    위의 글에서 MATLAB의 solve() 를 이용하면 x1 과 x2 가 다음과 같이 구해진다고 하셨는데요,
    아무리 해봐도 위의 글처럼 두개의 해가 나오는 것을 볼 수가 없었습니다.
    새로 만드신 함수 말고 원래 매트랩의 내장함수 solve 를 이용해서 해를 구하는 방법 좀 알 수 있을까요?
    답변 기다리겠습니다. 감사합니다.
    답글