MATLAB 수업자료 ( 기계항공시스템해석 2009.03.18) 1. Matlab 의소개 1.1 Matlab 이란? Matlab이란 MATrix LABoratory를뜻하는말로서, 수치해석, 행렬연산, 신호처리및간편한그래픽기능등을통합하여고성능의수치계산및결과의가시화기능을제공하는프로그램이다. Matlab은행렬과벡터를기본자료로사용하여기능을수행하는계산환경을제공한다. Matlab은기본적으로행렬을자료로다루기때문에 dimensioning이필요하지않으며통상적인프로그래밍언어들을사용하여프로그램을작성하지않고도쉽게수치계산을수행할수있다. Matlab의가장큰특징은 M-file(Matlab code가포함된 Text 파일, 확장자는.m) 을사용함으로써특정한해를구하는데필요한응용프로그램을손쉽게작성할수있다는점이다. 2. 행렬 (Matrices) 다루기 2.1 행렬과 Matlab Matlab에서행렬은직사각형의숫자들의배열이다. 1-by-1 행렬은스칼라를 1개의 row또는 column으로이루어진행렬은벡터를나타낸다. Matlab은다른언어들이한번에숫자들을일일이순차적으로계산하는것과달리, 전체행렬을빠르고쉽게계산할수있게해준다. Matlab은행렬외에도다른수치저장방법들을가지지만, 먼저행렬을다루는법을잘익히면 Matlab에쉽게접근할수있다. (1) 행렬입력하기 - 행렬입력방법 a. MATLAB의명령창 (Command Window) b. 내부명령또는함수들을사용하여행렬을생성 c. M-파일내에서행렬을구성 d. 외부의자료파일로부터행렬을불러들임 MATLAB은다른프로그래밍언어들과달리차원의선언이나변수형태의선언이필요없다. 컴퓨터가사용가능한크기까지자동적으로저장공간을할당해준다. - 행렬입력의규칙 a. 원소들은빈칸또는쉼표를사용하여분리한다. b. 전체원소들은대괄호 ( [ ] ) 로감싼다. c. 원소의끝에세미콜론 ( ; ) 을붙이면한행의종료를의미한다. - 1 -
>>A = [16 3 2 13; 5 10 11 8; 9 6 7 12; 4 15 14 1] ( 엔터 ) A = 16 3 2 13 5 10 11 8 9 6 7 12 4 15 14 1 ( 마방진 ) Workspace도확인해본다. (2) sum, transpose, and diag - sum >>sum(a) ans = 34 34 34 34 (column 벡터들의합이 row 벡터의형태로구해진다.) - transpose ex1) >>A' ans = 16 5 9 4 3 10 6 15 2 11 7 14 13 8 12 1 ex2) >>sum(a')' ans = 34 34 34 34 (row 벡터들의합이 column 벡터의형태로구해진다.) - diag ex1) >>diag(a) ans = 16 10 7 1 (\ 방향의대각선의원소들로이루어진 column 벡터를구한다.) ex2) >>sum(diag(a)) --> ans = 34 ex3) 반대방향 (/ 방향 ) 의대각선의합구하기 >>sum(diag(fliplr(a))) --> ans = 34 fliplr은행렬의좌우를뒤바꾸는함수이다. (3) Subscripts - A(i,j) = A의 row i 와 column j 에해당하는원소 A(4,2) = 15. A(1,4) + A(2,4) + A(3,4) + A(4,4) = 34 - Single Subscript A(k) = A의 column vector들을순서대로이어서하나의 column vector로만들었을때, k번째에해당하는원소 A(8) = A(4,2) = 15. - 2 -
- Subscripts를이용하여, 행렬에새원소를추가할수있음 >>X = A; >>X(4,5) = 17 X = 16 3 2 13 0 5 10 11 8 0 9 6 7 12 0 4 15 14 1 17 (4) The Colon Operator : (Matlab의가장중요한연산자 ) - 등차수열을만들어준다. 물론벡터형태로. 초항 : 공차 : 말항 1:10 --> 1 2 3 4 5 6 7 8 9 10 (row vector) 100:-7:50 --> 100 93 86 79 72 65 58 51 0:pi/4:pi --> 0 0.7854 1.5708 2.3562 3.1416 - Subscript 표현식에응용가능 sum(a(1:4,4)) = 4번째 column의합. sum(a(:,end)) = 마지막 column의합. ( : 그자체는 row 또는 column의전체원소를가리키게됨. end는마지막 row 또는 column를가리킴.) sum(1:16)/4 --> 34 2.2 Expressions 다른프로그램언어들과마찬가지로 Matlab 도변수, 상수, 연산자, 함수와같은표현식을 제공한다. 그러나다른프로그래밍언어와는다르게행렬과연관되어있다. (1) Variables - Matlab은변수형태의선언이나차원선언을요구하지않는다. - 명령줄이나 M-files에서새로운변수이름을발견하면자동적으로변수가생성되고저장공간이할당된다. 변수가이미존재하면변수내용이바뀐다. 필요하면새로운저장공간도할당된다. - 변수이름은문자, 숫자 ( 문자뒤에와야함 ), _ 가능. 31글자까지가능. 대문자와소문자는다르게인식함. (2) Numbers - 10진법, 소수점사용, 부호는숫자앞에표시. - 10의지수는 e를사용 6.02252e23 - 허수는 i or j를접미사로사용. -3.14159j, 3e5i - long 형식, 부동소수점으로데이터를저장, 총 16자리까지표현가능, 범위는 10^(-308)~10^(308) 까지. - 3 -
(3) Operators: 다른언어와마찬가지로산술연산자와그규칙을그대로이용. + Addition - Subtraction * Multiplication / Division \(\) Left division ^ Power ' Complex conjugate transpose ( ) Specify evaluation order (4) Functions - Matlab은많은양의수학함수들 (abs, sqrt, exp, sin.) 을제공함. help elfun, help specfun, help elmat에서확인가능. - 몇몇함수는유용한상수들의값들을계산해준다. pi : 3.14159265 i, j : Imaginary unit, eps : Floating-point relative precision, 2-52 realmin : Smallest floating-point number, 2-1022 realmax : Largest floating-point number, (2-e)21023 Inf : Infinity (0이아닌숫자가 0으로나누어졌거나, 값이 realmax 보다클때,) NaN : Not-a-number (0/0 or Inf-Inf 등값이수학적으로정의되지않을때,) - 함수이름은예약어가아니므로, 사용자가함수와똑같은이름을가진변수를선언해서사용해도상관없다. eps = 1.e-6, clear eps (clear는변수를 Workspace에서제거한다. 즉다시원상태로되돌림.) 2.3 행렬의생성과수정 (1) 내부함수로부터 - 특별한행렬들 magic: 마방진 magic(4) zeros: 0만으로구성된행렬 zeros(2)(2-by-2 행렬이됨 ), zeros(2,4) ones: 1만으로구성된행렬 5*ones(3,3) eye: 단위행렬 rand: Uniformly distributed random elements fix(10*rand(1,10)) randn: Normally distributed random elements randn(4,4) (2) load 명령어 load 명령어는이전에 Matlab에서생성된행렬이들어있는 2진파일들을읽어들이거나, 수치데이터가들어있는텍스트파일을읽어들인다. 텍스트파일을읽어들이는경우, 행렬로변환할수있게수치들이직사각형의표의형태로구성되어있어야한다. 수치들은공백 (blank) 으로구분되며, 1줄 (line) 에 1row씩구성되어있어야한다. 1줄에같은개수의데이터가들어가있어야한다. - 4 -
a. 메모장같은프로그램을이용하여. 다음과같은내용을 magik.dat로저장한다. 16.0 3.0 2.0 13.0 5.0 10.0 11.0 8.0 9.0 6.0 7.0 12.0 4.0 15.0 14.0 1.0 b. Matlab 명령창에서 load magik.dat --> 파일을읽은뒤, magik 라는변수를생성함. load 명령어대신에 Import Wizard(File -> Import Data) 의도움을받을수도있다. (3) M-Files M-File를이용해서행렬을만들수도있다. a. FIle -> New -> M-Files, 다음과같은내용을 magik.m으로저장 A = [... 16.0 3.0 2.0 13.0 5.0 10.0 11.0 8.0 9.0 6.0 7.0 12.0 4.0 15.0 14.0 1.0 ]; b. Matlab 명령창에서 magik --> 파일을읽은뒤, 변수 A 를생성함. (4) 행렬의접합 B = [A A+32; A+48 A+16] B = 16 3 2 13 48 35 34 45 5 10 11 8 37 42 43 40 9 6 7 12 41 38 39 44 4 15 14 1 36 47 46 33 64 51 50 61 32 19 18 29 53 58 59 56 21 26 27 24 57 54 55 60 25 22 23 28 52 63 62 49 20 31 30 17 (5) 행렬의원소를지우는방법 ex1) row 또는 Column을지울때, X = A; X(:,2) = [] X = 16 2 13 5 11 8 9 7 12 4 14 1 ( 두번째 Column이지워짐 ) - 5 -
ex2) 원소하나를지울때, X(1,2) = [] -> error. single subscript를이용해서 single element를지울수있다. 이때, 결과는 row 벡터로나타남. X(2:2:10) = [] -> X = 16 9 2 7 13 12 1 (6) 행렬의 row 또는 column 을바꾸는방법 >>B = magic(4) B = 16 2 3 13 5 11 10 8 9 7 6 12 4 14 15 1 >>A = B(:,[1 3 2 4]) A = 16 3 2 13 5 10 11 8 9 6 7 12 4 15 14 1 (2번째 column과 3번째 column의줄이바뀌게됨.) (7) 행렬의원소수정 >> B(1,1) = 5 >>B(1:2,2:3) = 0 B = 5 0 0 13 5 0 0 8 9 7 6 12 4 14 15 1 2.4 More About Matrices (1) Linear Algebra - 행렬은 linear transformation을표현할수있는 2차원배열. - 덧셈 : A + B, 곱셈 : A*B, 지수 : A^k - 나누기 좌측나누기 : X=A\B -----> A*X=B의해 (X = inv(a)*b) 우측나누기 : X=A/B -----> X*B=A의해 (X = A*inv(B)) - determinant: det(a) - row echelon form: rref(a) - inverse matrix: inv(a) - eigenvalues: eig(a) - characteristic polynomial: poly(a) poly(a) = 1-34 -64 2176 0 -> det( A - I ) = - 34-64 + 2176 (4) Scalar Expansion - 행렬에스칼라뺀것은행렬에모든원소에그스칼라값을뺀것과같다. - 6 -
>> B = A - 8.5 (A는 (6) 행렬의 row 또는 column을바꾸는방법 에서구한 A) B = 7.5-5.5-6.5 4.5-3.5 1.5 2.5-0.5 0.5-2.5-1.5 3.5-4.5 6.5 5.5-7.5 2.5 Command Window 의입력과출력제어 (1) format 명령어 : format 명령어는 Matlab에서화면에출력되는값들의표현형식을제어한다. 오직출력되는형식만제어할뿐, 계산하고저장하는방식에는영향을미치지않는다. sprintf와 fprintf 함수를이용하면출력형식을좀더자세히제어할수있다. x = [4/3 1.2345e-6] format short --> 1.3333 0.0000 format short e --> 1.3333e+000 1.2345e-006 format short g --> 1.3333 1.2345e-006 format long --> 1.33333333333333 0.00000123450000 format long e --> 1.333333333333333e+000 1.234500000000000e-006 format long g --> 1.33333333333333 1.2345e-006 format bank --> 1.33 0.00 format rat --> 4/3 1/810045 format hex --> 3ff5555555555555 3eb4b6231abfd271 format compact --> 결과출력시, 빈줄을나타내지않음. (2) 출력결과를나타내고싶지않을때 : 명령문을입력하고, 엔터를치면 Matlab 은그계 산결과를자동적으로화면에출력한다. 이를원하지않으면문장의끝에 ; 를붙인다. A = magic(100); (3) 명령문이길어 2줄이상으로입력해야할때 :... 를입력한뒤, 엔터를치면, 커서가다음줄로넘어가다음줄에이어서입력할수있다. s = 1-1/2 + 1/3-1/4 + 1/5-1/6 + 1/7...( 여기서엔터 ) - 1/8 + 1/9-1/10 + 1/11-1/12; - 7 -
3. MATLAB 그래픽 3.1. 서론 MATLAB은자체로서수치계산프로그램이기도하지만계산결과나데이터를그래픽으로처리할수있는훌륭한후처리기 (Post-Processing) 이기도하고다른프로그램언어를사용한후처리보다쉽고강력한그래픽기능을제공한다. MATLAB에서는데이터를디스플레이하기위해서 line plot, bar, histogram과같은그래프나 contour plot, mesh 나 surface plot 그리고 animation 과같은고 ( 高 ) 수준의그래픽관련함수를제공한다. 또한자체의 MATLAB command 나그래픽창의팝업메뉴를사용하여그래픽객체의 color 나 shading, 그리고축의라벨링등을제어할수있도록해준다. MATLAB에서는 C언어에서와같이어떤그래픽객체를표현하기위해서그래픽장치를설정해준다든지그래픽시스템을초기화한다든지하는작업을할필요가없다. 사용자는단지다른 MATLAB함수나명령어를사용하는것과마찬가지로그래픽과관련된 MATLAB 함수를적절한입력값으로사용하면된다. 3.2. 2 차원그래픽 3.2.1. 2차원그래픽을그리는절차 (1) plot 할데이터를준비한다. (2) 데이터를 plot 할그림창을선택하고 single graphic으로할건지 Multi graphic으로할건지선택한다. (3) plot 함수를도출한다. (4) Line 이나 marker 의 property를선택한다. (5) 축의한계값, Grid line 등을설정한다. (6) xlabel( 축 ), legend( 삽입문, 범례 ), text( 제목및부가설명 ) 등으로그래픽객체에라벨링을한다. (7) 그래픽객체를출력한다. 0 x 10 에대해서 sin cos 를 2 차원그래프에그려보자. (1) plot 할데이터를준비한다. >>x=0:0.01:10; >>y=sin(x).*cos(x+pi/2); >>size(x) ans = 1 1001 >>size(y) ans = 1 1001 (2) 데이터를 plot 할 Figure 창을선택하고 Single graphic 으로할건지 Multi graphic 으로 할건지를선택한다. >> figure(1) - 8 -
(3) plot 함수를호출한다. >> plot(x,y); (4) Line 이나 marker 의 property 를선택한다. >> set(plot(x,y),'linestyle,'--') (5) 축의한계값, Grid line 등을설정한다. -MATLAB에서축의한계값은그래프에그릴데이터의크기에맞도록자동으로조정된다. 만약자동으로설정된축의한계값을바꾸고싶을때는 axis를사용한다. 또한그래픽객체에격자 (grid) 를그리거나지우고싶으면 grid in/off 를사용한다. >> axis([1,5,-0.5,0]) >> grid on (6) xlabel, legend, text 등으로그래픽객체에라벨링을한다. >> xlabel('x'); >> ylabel('y'); >> title('plotting x and y'); (7) 그래픽객체를출력한다. - 출력의방법에는 2가지가있다. 첫째는비트맵과같은그래픽파일형식으로그래픽객체를저장. 둘째는프린터를사용하여그래픽객체를직접인쇄. >> print -dbitmap ex1.bmp % bitmap format 을사용하여 >> dir ex1.bmp % ex1.bmp" 라는파일명으로저장 ex1.bmp % ex1.bmp" 라는파일이생성되었음 3.2.2. 새로운그림창의생성과 Multi-graphic 객체 (1) figure 함수의용도 a. 새로운그림창을생성. >> figure % Figure No.1 을생성 >> figure % Figure No.2 을생성 >> figure(10) % Figure No.10 을생성 b. 이미존재하는그림창을활성화. >>figure(2) % Figure No.2 그림창이활성화되면서앞으로수행될그래픽관련된작업은다른그림창이활성화되기전까지는모두이그림창에서이루어지게된다. (2) Multi-graphic 객체하나의그림창안에다수의그래프를그리고싶을때 subplot을사용하면된다. 즉, 하나의그림창을하부의영역으로나누어주는작업을수행하는함수가 subplot이다. subplot(m,n,i) 또는 subplot(mni) 는하나의그림창을 m x n 의하부영역으로나눈다. 여기에서 i 는 m x n 의영역으로나누어진하부영역의순서를나타내는것으로위에서아래, 왼쪽에서오른쪽으로지정된다. - 9 -
(3) 이미존재하는그래프에새로운그래프를추가 hold 명령어를사용하면기존의그래프에추가로입력한수식의그래프가도시된다. 3.2.3. 기본적인그래픽함수들과 plot 의제어 (1) 기본적인그래픽함수 함수 설명 plot x와 y 축에대해서모두선형배율 (linear scale) 로된그래프를그린다. loglog x와 y축에대해서모두 log 배율로된그래프를그린다. semilogx x축에대해서는 log배율로 y축에대해서는선형배율로된그래프를그린다. semilogy x축에대해서는선형배율로 y축에대해서는 log 배율로된그래프를그린다. plotyy y축의좌우에값으로라벨이된그래프를그린다. (2) plot 제어 위의도표에서 plot 을포함한이하함수들도마찬가지로같은방법으로제어한다. plot(x,y,'color+linestyle+marker') < 가능한선의 color> MATLAB에서의 MATLAB에서의 Color(RGB값 ) symbol symbol Color(RGB값 ) c Cyan(011) g green(010) m Magenta(101) b blue(001) y yellow(110) w white(111) r red(100) k black(000) < 가능한선의 style> MATLAB에서의 MATLAB에서의 Style symbol symbol Style - Solid line : Dotted line -- Dashed line -. Dash-dot line none No line - 10 -
< 가능한선의 marker> MATLAB에서의 symbol + (plus sign) o (Circle) * (asterisk). (point) X (cross) Square (square) Diamond (Diamond) Marker Style MATLAB에서의 symbol Marker Style ^ + (Upward pointing ^ triangle) v o (Downward pointing triangle) * > < x pentagram hexagram * none No marker plot(x,y,'b-') 3.2.4. 복소수데이터처리 MATLAB에서제공되는복소수관련함수는 isreal, real, imag, conj, abs, angle 등이있다. - isreal은주어진입력값이복소수인지실수인지를결정해준다. 실수는 1, 복소수는 0으로반환한다. - real과 imag는각각주어진복소수입력값에서실수부만을반환하고허수부만을반환한다. - abs와 angle은각각복소수의크기와각도를계산한다. 단, 각도의단위는라디안이며부호는 1, 2 사분면에서존재할경우양의각으로, 3, 4 분면에서는음의각으로계산된다. >> a= 1+2i; >>isreal(a) ans = 0 >> b= 2; >> isreal(b) ans = 1 3.2.5. 축의한계값조정 축의최대최소값은기본적으로데이터의최대최소값에따른다. 이러한축의범위를바꾸 고싶으면 axis 명령어를사용하면된다. axis(v) v=[x 축의최소값, x 축의최대값, y 축의최소값, y 축의최대값 ] 의행벡터이다. - 11 -
>>x=0:0.1:10; >>y=sin(x); >>plot(x,y); >>v=[0,6,-0.2,0.6]; >>axis(v) 3.2.6. 그래픽객체의라벨링 (annotation) < 그래픽객체의라벨링관련함수 > 함수명 설명 title 그래프의제목을첨가 xlabel x축에제목첨가 ylabel y축에제목첨가 zlabel z축에제목첨가 legend 그래프에범례첨가 text 그래픽객체의임의의위치에문자열첨가 gtext 마우스를사용하여첨가문자열위치지정 grid 그래픽객체에격자첨가혹은제거 >>t=0:0.1:50; >>x1=sin(t+pi/2); >>x2=exp(-0.1*t).*sin(t); >>plot(t,x1,'b-',t,x2,'r--') >>xlabel('time(sec)'); >>ylabel('displacement(m)'); >>title('free&forced Vibration'); legend(' 문자열 1, 문자열 2,..., 문자열 n, 정수 ) 정수는그래프내에서범례가더해지는위치를결정하는것으로 0 은그려진데이터를고려 해서 MATLAB 에서결정한최적의위치를, 1 은오른쪽위를, 2 는왼쪽위를, 3 은왼쪽아래 를, 4 는오른쪽아래를, -1 은그래프영역오른쪽밖을, 없으면 default 의위치를나타낸다. text는함수를호출할때문자열과그문자열이더해질위치를같이입력하고, gtext는문자열만입력하고그래프창이활성화되면서그문자열이더해질위치는마우스를사용해서결정한다. text(x좌표,y좌표, 문자열 ') \leftarrow 와 \rightarrow 는문자열에화살표를추가해주는기능을한다. - 12 -
4. SYSTEM CONTROL ANALYSIS 4.1 시스템제어에활용되는함수 4.1.1 num, den, tf 라플라스전달함수 h(s) 에서 num 과 den 은각각분자 (numerator) n(s) 와분모 (denominator) d(s) 의 s 변수에대한다항식의계수를대표하는함수이다. 그리고 tf 는 num, den 변수들을가지고라플라스전달함수 h(s) 를구성하는함수이다. >> num=[1 0]; >> den=[1 2 10]; >> h=tf(num,den) Transfer function: s --------------------- s^2 + 2 s + 10 4.1.2 residue residue 란부분분수와다항식의계수전환을가능케하는함수이다. 기본표현은다음과같다. [r,p,k]=residue(b,a) [b,a]=residue(r,p,k) b,a r p k s에대한내림차수다항식의분자, 분모계수나머지의계수극점의계수분수가아닌다항식의계수 - 13 -
다음과같은함수에대하여 residue 함수를적용해보자. b=[5 3-2 7]; a=[-4 0 8 3]; [r,p,k]=residue(b,a) r = -1.4167-0.6653 1.3320 p = 1.5737-1.1644-0.4093 k = -1.2500 한편 residue를역으로 [a,b] 에대하여 [r,p,k] 를가지고실행하면 [b,a] 가분모의최고차항을 1 로하는기준화를시키기때문에계수가바뀌게된다. 하지만결과는당연히동일한식이다. >> [b,a]=residue(r,p,k) b = -1.2500-0.7500 0.5000-1.7500 a = 1.0000-0.0000-2.0000-0.7500 4.1.3 다양한함수들 (step, impulse, lsim,...) 응답함수에는다양한형태의입력을반영하는함수들이개별적으로존재한다. 그중제어에서가장흔하게사용하는형태는스텝함수 (step), 임펄스함수 (impulse) 가있다. 이것은구성한시스템에대하여설정한응답에대한거동을살피기위한함수로서사용법은다음예제와같이사용한다. 그리고설계한시스템에대한거동을시뮬레이션으로살펴보기위해시뮬레이션함수 (lsim) 를사용한다. ex1) step function t=0:0.01:8; num=[2 10]; den=[1 2 10]; sys=tf(num,den); step(sys,t) ex2) impulse function num=[7.9984]; den=[50.01 100 2500]; sys=tf(num,den); impulse(sys) ex3) lsim function num=[2 10]; den=[1 2 10]; sys=tf(num,den); t=0:0.01:4; u=t; lsim(sys,u,t) ex1 step function ex2 impulse function ex3 simulation function - 14 -