본문으로 바로가기
MATLAB Simulink는 간단한 사용방법을 가졌지만, 꽤 유용한 (하긴 그런 툴이 정말 많지만 말이죠...^^) Parameter Estimation Toolbox를 가지고 있습니다.

이걸 이용하면 구하고 싶은 파라미터를 추정해볼 수 있는데요. 이번에는 요걸 한번 소개해보도록 하겠습니다.

먼저 좋은 실험 환경이 있었으면 참 좋겠지만, 그런 환경이 없으니 말이죠. 이 파라미터추정 실습을 위해 먼저 데이터를 만들어야겠네요..ㅠㅠ


먼저 Simulink에서 위와 같이 꾸밉니다. Sine Wave에는 아무것도 안건드리고 디폴트로 두었어요. 빨간 표시가 있는 곳에 -2, -1을 넣어둡니다. 그리고 실행해서 Scope를 열어보면


이런 결과가 나는데요. 여기서 표시된 아이콘을 누르고


Data History를 선택해서 Limit data points to last를 해제하시고, Save data to workspace를 선택하신후 SimOut이라고 적고, Array를 선택하지요. 아참 Scope 설정을 바꿨으니 다시 실행하시구요.


그럼 Workspace에 SimOut이라는 행렬이 저장된것이 나타납니다. 1열은 시간축이구요. 2열은 시뮬링크에서 꾸민 결과값이고, 3열은 입력이지요. 이제 이걸 데이터로 선택할 겁니다. 

무슨말이냐면, 예를들어 어떤 시스템이 있다고 치죠. 아까도 말했지만, 우리는 없으니, 저 시뮬링크로 꾸며서 얻은 데이터를 실제 실험데이터라고 생각하는겁니다. 그 시스템에 입력을 주고 출력을 받은거죠. 그리고, 실제상황에서 우리는 gain, gain1 블럭에 들어가는 -1,-2라는 값을 모르는 겁니다. 그래서 그걸 찾아보겠다는 거죠.


시뮬링크 새창을 열어서 위와 같이 꾸밉니다. input, output port를 사용하시구요. 파란표시된 부분에 어떻 값을 가져야하는지 몰라서 a, b라고 둔 것이죠.^^

이제, 실험데이터를 이용해서 저 a,b값을 찾아보는 겁니다.


중간에 해도 되지만, 일단 a, b의 초기값이 있어야합니다. 그래서 둘다 -10이라고 대충 입력해두구요.


Estimation할 블럭 (즉, 두번째로 꾸민) 시뮬링크에서 Tools 메뉴에 Parameter Estimation을 선택하시면,


위와 같은 창이 뜹니다. 거기서 Transient Data를 선택하시고


New를 누르시면


이렇게 되는데요. Import를 선택하시면,


요런 창이 떠요. 여기서 SimOut을 찾으시고, 표시된 입력(3열)을 선택하신다음


Input Data의 data가 빈칸인데요. 거길 누르고, 방금전 창에서 Import를 누르면 위에서 처럼 데이터가 들어갑니다. PlotData를 해보시면 확인하실 수 있구요


또 저 시간의 빈칸을 선택하시고


1열을 선택하고 Import를 누르면 데이터가 들어갑니다.


이번에는 Output Data 탭에서 Data공간을 선택하고


2열을 선택하고 Import를 하시면 되구요. Output의 시간또한 같은 방법으로


입력하시면 됩니다. 


이제 Variable에서 Add를 누르시면


변수로 simulink에 들어가 있던 a, b가 나타나는데요. CTRL과 마우스를 이용해서 선택하신 다음 OK를 하시구요


a를 선택하고 Maximum값을 줍니다. 

사실 아무것도 없는 곳에서 그냥 완벽하게 추정해주면 좋겠지만, 현실은 그렇지 못하거든요. 그래서 개략적인 범위를 인가하는데, 저는 a,b가 음수라는 최소한의 정보를 알려주겠다는 것이죠.


같은 방법으로 위에서처럼 b도 설정해주시면 됩니다. 그리고, 


Estimation에서 New를 선택하시고


NewEstimation에서 Parameter 탭을 누르고 추정할 변수 a,b를 모두 체크하시고


다시 Data Sets 탭에서 New Data를 체크하십니다.


그리고 Views에서 New를 누르고


여러가지 상황을 보실 수 있지만


실험치와 추정치의 비교 그래프만 보기로 하겠습니다. 위에 표시된 대로 하시고, Show Plots를 선택하시면


일단 실험치의 출력이 나옵니다.


다시 NewEstimation에서 Estimation 탭을 누르시고, Start를 하면 추정을 시작합니다.


결과나 나왔네요.


Parameters 탭에 보면, 원래 설정되었던 -2,-1에 아주 근접한 수치를 구했다는 것을 확인할 수 있습니다. ^^



이번에는 실제실험에서 항상나타나는 노이즈를 살짝 실어서 측정데이터를 바꿔보죠. 처음 꾸몄던 Simulink화일에서


위와 같이 노이즈라는 개념으로 블럭하나를 추가했습니다.


그러면 데이터가 저렇게 좀 지져분해지죠.. 그래도 a,b값을 잘 찾는지 보겠습니다. 위의 과정을 수행하시고 나면


이렇게 실험치과 추정치의 그래프가 잘 나타난다는 것을 확인할 수 있구요


파라미터도 잘 찾았음을 알 수 있습니다.^^



댓글을 달아 주세요

  1. BlogIcon 라라윈 2010.05.25 01:27

    핑크윙크님.. 혹시 sas나 HLM 은 사용 안하시나요?
    그 프로그램 사용하시면 MATLAB강의와 함께 강의 좀... ^^;;;
    요즘 프로그램 잘 못 다뤄서 넘 괴롭습니다..ㅜㅜ
    모수추정... 거대한 산이에요..

  2. bylion 2011.03.07 21:33

    혹시 simulink 에서 scope 보면 limit data point to last 으로 끊겨서 보여지자나요?? 이걸 scope라는 block 말고 simulink 자체에서 data 양을 안끊기게끔 늘릴수는 없을까요 장비 돌리는데 data가 한정되서 받아지네요..ㅠㅠ

  3. patrick 2011.03.15 21:58

    Matlab 내에 있는 FItlab으로 parameter id 하는 것을 공부하고 있습니다.

    방명록에 글 올렸는데ㅠㅠㅠ

    주의사항을 보고 여기다 다시 올려야 겠다 싶더라구요ㅠㅠㅠ

    음_!

    제가 궁극적으로 알고 싶은 것은 명령어 중 "who, whos"라는 것이 있는데 이 명령어를 사용하기 전 반드시 data를 structure 해야 할 것 입니다.
    그렇다면 who 또는 whos 명령어를 사용하기 위한 data structure 명령어 구문이 어떻게 되는지 알고 싶습니다.
    몸이 불편하시다고 들었는데 꼭 알려주셨으면 여한이 없겠습니다 ㅠㅠㅠ

    • BlogIcon PinkWink 2011.03.16 09:02 신고

      방명록에 있는 내용과 동일 내용이라 방명록에 다신 댓글을 삭제했습니다.

      다른 화일에 who 명령을 사용하고 싶다면 옵션 (-file)을 사용하면됩니다.

      who - file testfilename

      이렇게요. 이때 testfilename은 mat화일이면 됩니다. 그리고 질문중 data를 structure한다는 말의 뜻은 잘 모르겠습니다.^^

  4. patrick 2011.03.16 15:18

    어제 올렸던 질문에 대한 답변 잘 봤습니다.

    제가 다시 한 번 질문을 드린 것을 보았더니 이건 앞뒤도 없고 무슨 말을 하는건지도 모르겠는데 그래도 답변을 해주신 것에 대해 정말 감사드립니다.

    하지만 역시 질문이 옳지 못했기 때문에 제가 알고자 하는 답변을 구하지 못해 다시 한 번만 여쭙겠습니다.

    모델명이 laengs_1 이란 파일이 있습니다. 이 파일은 .mat 로 저장이 되어 있습니다.

    >>load 'laengs_1'

    >> who

    your variables are

    data nchan parameter scanrate units

    laengs_1 이란 파일을 읽기 위해 위와 같은 명령어를 주면 결과가 나타납니다. 이 때 각각의 명칭이 의미하는 바는 아래와 같습니다.

    data : laengs_1 파일 안에 존재하는 데이터 값

    nchan : data parameter 갯수

    parameter : data 내에 존재하는 데이터값의 각각의 이름

    scanrate : sampling time

    units : 각 데이터 값의 단위

    제가 생각하기에는 laengs_1 이라는 파일을 컴퓨터로 생각했을 때 다섯개의 parameter 는 폴더이고 각각의 parameter 안에 존재하는 data들은 폴더 내에 있는 파일이라고 여겨집니다.

    제가 알고 싶은 것은 제가 갖고 있는 다른 파일을 위의 방법으로 표현해내기 위한 명령어 입니다.

    책을 뒤지고 직접 손으로 만져가면서 해보고는 있으나 사실 제자리 걸음이라 다시 한 번 도움을 구합니다.

    몸도 불편하신데 이런 질문을 자꾸 드려 죄송하지만, 훌륭한 공학도 후배 한 명 만든다고 생각하시고 명쾌한 답변 부탁드리겠습니다.

    감사합니다.

    • BlogIcon PinkWink 2011.03.16 18:57 신고

      좋은 대답은 좋은 질문에서.. ^^
      그래서 보통 질문을 정리하다보면.. 저절로 대답이 만들어지는 경우도 있죠.
      일단 patrick님의 질문의 요지를 이해하기가 좀...ㅠㅠ
      (아마 저의 이해력 때문이겠죠...)

      일단 질문을 정리하면...

      임의의 데이터를 읽어서

      어떤 놈은 a라는 이름으로
      어떤 아이는 b라는 이름으로 각각 저장하며
      또 그와 동시에 데이터의 형(type)도 정의하겠다는 것인가요?

      일단 이 해석이 맞다면,
      그걸 바로 수행하는 명령어는 제가 아는 것에서는 없습니다.
      (제가 아는 한도에서는..^^ MATLAB은 무지무지 명령어가 많으니까요.^^)

      사용자가 그냥 만들면 될 듯 합니다만...

      도움이 되지 못해 죄송합니다.ㅠㅠ

    • patrick 2011.03.16 21:29

      정확하지는 않지만... 찾아낸 듯 합니다!

      제가 말을 잘 못해서 그랬는데, 자료들을 찾아보니까 Indexing 방법의 문제더군요..

      좋은 질문을 드리지 못하여 좋은 답변을 유도하지 못한 것 사과드립니다ㅠㅠㅠ

    • BlogIcon PinkWink 2011.03.17 08:50 신고

      네.. 찾으셨다니 다행입니다. ^^

  5. 루도군 2013.11.01 19:58

    파라미터 추정하는데 잘 되다가 중간에 추정하는 것을 멈추는데
    옵션 부분을 설정 해줘야되는건가요?

  6. 오시 2015.02.06 00:14

    안녕하십니까?
    아까 낮에 다른 게시물에 남겼던 공학도 입니다!
    밸런싱 동역학은 어느정도 해석 했는데 파라미터가 발목을 아주 크게 잡는군요..
    매틀랩에는 위와같이 파라미터를 추정해주는 함수가 있네요. 저는 매틀랩(시뮬링크)을 써보지 않아서 그런 추정치를 쓸수 없는데, 저는 랩뷰를 사용해서 시뮬링크와 비슷한역할을 하는 "컨트롤 디자인과 시뮬레이션"이라는기능을 사용합니다. 그런데 거기에 위의 파라미터 추정치 계산 함수가 없어서 그냥 손으로 풀거나 프로그램으로 만들려고 하는데 추정치를 산출하는 공식이나 알고리즘이 있을까요?
    써놓고 보니 난해한 질문이네요.....ㅠㅠ

    • BlogIcon PinkWink 2015.02.06 12:37 신고

      일반적으로 모터는 많은 방법들이 공개되어 있습니다. 저 역시 밸런싱로봇의 동역학을 검증하는 단계에서 모터단을 ID하는 부분을 살짝 언급했었구요. 랩뷰는 안써본 툴이라 잘 모릅니다만.. 에스티메이션 툴박스 없이도 밸런싱 로봇 정도라면 여러 실험을 통해 찾을 수 있습니다.
      http://pinkwink.kr/336
      위 글을 참조하시기 바랍니다.

  7. BlogIcon GeonHee 2017.06.29 10:20

    안녕하십니까 모터제어에 관심이 있는 학생입니다.

    모터의 스펙을 알고 싶은 것이 목적입니다.

    블로그를 보면서 파라미터 추정은 제가 만든 블록의 scope결과를 배열로 보내 파라미터 추정 값을 구해 보았습니다.

    실제로 기준이 되는 스코프의 모형(배열의 값)은 어떻게 얻는 지 궁금하게 되었습니다.
    혹시 실제 모터 결과 데이터를 어떻게 얻을 수 있는 지 알고 싶습니다.
    (Atmega128을 이용해서 모터제어를 할 경우 스코프의 결과를 매틀랩에서 배열로 표시하고 싶은 것 입니다)

    감사합니다.

    • BlogIcon PinkWink 2017.06.29 13:54 신고

      저는 보통 이런 경우...
      AVR이든... 어떤 MCU를 이용해서 실험데이터를 시리얼 통신으로 받아서 텍스트로 저장해두었습니다.
      그리고 그걸 MATLAB에서 읽어서 실뮬레이션과 비교하며 값을 찾습니다.
      그 비슷한 과정을 수행했음을 살짝 언급한 글이
      http://pinkwink.kr/336
      이런 글입니다.

  8. 히히덕 2019.03.26 14:31

    Tools에서 Parameter Estimation을 이용하고 싶은데 제 것에는 Tools목록에 Parameter Estimation 버튼이 없더라구요 ㅠㅠ 프로그램을 확장해야 나오는 건가요??

  9. 김민 2019.05.29 20:03

    안녕하세요 핑크윙크님
    parameter esimation 할때 , 다음 챕터https://pinkwink.kr/319?category=166585에 나오는 진자동역학식으로 simulink 꾸미신건가요 ??

  10. hwang 2019.08.05 19:14

    여기 메틸렙 버젼이 몇인가요? 제가쓰는거랑 좀달라서 ㅠ 여기버젼 혹시 다운받을수있는 링크좀 걸어주실수있나요