operator01.jpg



안녕하세요? LGS입니다.

이번시간에는 Simulink와 MATLAB Toolbox(GA)를 연동하는 방법에 대해서 설명드리겠습니다. ^^

잘 따라 오시면 어렵지 않아요~ 

(본 강좌는 akula01님의 질문에 대한 답변이기도 합니다.)


우선 Simulink와 MATLAB Toolbox의 연동을 위해서는 Workspace에 대한 이해가 조금 필요합니다.


Simulink_GA01.png


Workspace는 변수와 값들이 저장되는 공간을 말합니다.

command window에서 >>A=1 이라고 입력하면 Workspace에 변수 A가 생성되고  값 1이 저장되는 것이 보이실 겁니다.^^


그런데 MATLAB 전체로는 workspace가 하나가 아니라 크게 3개의 Workspace로 나뉩니다.

이름하야!! MATLAB Workspace, Function Workspace, Simulink Workspace입니다요~ ^^

방금 위의 command window에서 입력한 변수 A는 MATLAB Workspace에 저장이 되었구요~

함수를 만들어서  함수 내부에서 처리되는 변수들은 Function workspace에 저장되고

시뮬링크는 시뮬링크 변수들이 노는 공간(시뮬링크 워크스페이스)이 따로 있다 이 말입습죠

이해가셨나요? =(=^ㅅ^=)=


각 workspace 간에 값을 주고 받을 수 있습니다.

MATLAB Workspace와 Function Workspace의 경우 입력변수와 출력변수로써만 값을 주고 받을 수 있습니다.

즉 MATLAB Workspace에 있는 변수를 함수의 입력변수로 받지 않는 한 함수 안에서 마음대로 MATLAB Workspace에 있는 애들을

가져다 쓸 수 없어요 ;;


MATLAB Workspace와 Simulink Workspace는 기본적으로 공유가 가능합니다. 야홋!!

Simulink에서 Block의 parameter를 변수로 잡아 놓으면 알아서 MATLAB Workspace에 있는 변수의 값을 참조합니다.


그!런!데! Simulink와 Function 사이에는 직접 변수를 공유할 수가 없어요 ㅜㅜ

이건 조금 있다가 다시 설명드릴께요~


자~ Workspace에 대한 기본적이 이해가 끝났으니 본격적으로 Simulink에서 놀아봅시다요~ o(^o^)o

아래와 같이 Simulink Model을 구성했다고 합시다.
(To Workspace 블럭은 Library Browser의 Sink 항목에 있습니다. mdl 파일은 밑에 첨부해두었습니다.)


Simulink_GA02.png  


아래쪽의 Sine Wave1 블럭을 더블 클릭하여 창을 연 다음 계수를 조금 조정하겠습니다.


Simulink_GA03.png


그리고 다시 윗쪽의 Sine Wave2 블럭을 더블 클릭해서 창을 여신 다음


Simulink_GA04.png


Amplitude, Bias, Phase 항목을 각각 A, B, P라는 이름의 변수로 지정합니다.

마지막으로 To Workspace 블럭을 여셔서 


Simulink_GA05.png


Save format을 Structure With Time으로 변경해주세요~ ^^

지금 무엇을 하려고 하나면요(이미 눈치 채셨겠지만 ^^) Sine Wave2 블럭의 A, B, P 변수를 조정해서 

Sine Wave1 블럭이랑 비슷한 파형을 만들려고 하고 있습니다.

즉 (Wave2 - Wave1)를 최소화 하려고 해요~ 무엇을 이용해서 최소값을 찾는 다구요? 넵 GA Toolbox를 이용해서요~ 

여러분이 여러분의 모델로 직접 작업하실 때에는 To Workspace 블럭으로 최소화하고자 하는 녀석을 내보내시면 됩니다.


자~ Ctrl + S 누르셔서 simulink_GA로 저장하시구요

이제 Simulink에서 하실 일은 끝났습니다. Simulink를 종료하셔도 상관없습니다요~ ^^


이제 GA를 굴리기 위한 Fitness Function을 작성해 봅시다.

GA(Genetic Algorithm)에 관한 설명은 여기를 참조하세요.


(중략)

 

GA(Genetic Algorithm 유전자 알고리즘)의 특성상 cost를 평가하는 Fitness "Function"이 반드시 필요하고

Simulink Model과 GA를 연동하려면 필수적으로 Fitness Function 안에서 Simulink를 작동시켜야 합니다.

 


Simulink를 Model Viewer(블럭들이 그려져있는 곳)에서 실행시키는 것이 아니라 

함수나 script에서 실행시키고 싶으시면 sim 이라는 함수를 사용하시면 되구요~


그런데 문제점이 하나 있습니다 ;;

맨 위에서 설명 드렸듯이 Simulink Workspace와 Function Workspace는 기본적으로 공유가 안되거든요 ;;


(중략)


즉 Simulink의 Workspace의 공유를 [기본적으로 연결되어 있는 MATLAB workspace]가 아니라 

현재 code가 실행되고 있는 function workspace로 변경하겠다는 말이죠~  이해 가시나요?

Sine Wave2 블럭에 있던 A, B, P 변수들은 이제 function workspace에 있는 A, B, P를 참조합니다.


sim 함수의 사용법은 sim('시뮬링크 모델 이름',option)과 같이 사용하시면 되구요~

sim 함수로 Simulink를 돌리고 난 결과가(To Workspace 블럭으로 지정한 값) result에 저장되겠죠?

sim 함수는 output으로 class를 돌려줍니다. (Class Type의 간략한 설명 본문 내용 중간 쯤) 

class라는 녀석은 다른 것이 아니고 값을 저장하는 변수와 실행 가능한 함수를 함께 가지고 있는 녀석입니다.

즉 class형 변수는 double이나 struct, cell과 같은 data type의 일종입니다.


지금 우리의 경우 result의 simout 항목(property)에 결과값이 저장되어 있구요~

get 함수를 사용하여 우선 result에서 simout을 가지고 온 다음

struct 참조를 통해 simout.signals.values를 참조하면 됩니다. (values 안에 (Wave2 - Wave1) 의 값이 들어 있습니다.)

나머지는 문제없으실테고... 

Ctrl + S를 눌러 myGA.m으로 저장해주세요.


자~ Fitness Function 작성도 마쳤구요~ 예~ o(^o^)o  GA Toolbox로 넘어갑시다요~ 

Command window에서 >>gatool 이라고 입력하시면 Optimization Tool Dialog가 뜨구요


Simulink_GA07.png


방금 작성하신 myGA 함수를 function handle로 Fitness function 항목에 넘기고

찾고자 하는 변수의 개수가 3개 (A, B, P)이므로 Number of variables에 3을 입력합니다.

그리고 마지막으로 아래에 있는 Start 버튼을 폭풍 클릭!! 하시면~~

(진화 과정을 보시려면 GA Tool 가운데 부분에 있는 Plot function 탭의 Best fitness를 체크하셔도 됩니다.)


 Simulink_GA08.png


주르륵 진화가 진행되구요~ ^^


Simulink_GA09.png


결과를 보시면...


Simulink_GA10.png

Objective Function의 값이 0.095로 Optimal Point에 근접했고 그때의 최적해(A, B, P의 값은) 5.049, 2.999, 1.007로

초기 우리가 의도했던 Wave1의 계수 5, 3, 1을 아주 정확하게 찾아내고 있음을 확인할 수 있습니다.

계산된 결과 값은 Optimization Tool의 Menu -> File -> Export to Workspace를 클릭하여 MATLAB workspace로 export할 수 있습니다.