부록 MATLAB 기초및프로그래밍 1. MatLab 기초 2. MatLab 의행렬연산 3. MatLab 그래프 (Graphics) 4. MatLab 프로그래밍 충남대학교선박해양공학과안병권교수
1. MATLAB 기초 MATLAB 은 Cleve More 에의해처음개발된이후현재의 MathWorks 사에의해 C++ 로 작성된수학및공학응용소프트웨어이다. Matrix Laboratory 에서그이름이유래된것으로도 알수있듯이행렬연산을매우효율적으로처리할수있도록설계되었다. MATLAB 의 프로그래밍체계는우리에게익숙한수학적연산기호와 C, C++ 언어와유사하게행해지기때문에초보사용자들도쉽고빠르게사용할수있다. MATLAB 의기본데이터요소는차원의제한이없는배열 (array) 로기존의프로그래밍언어에서와는달리행렬연산을위해해당함수를만들어줄필요가없으며, 배열을일괄적으로계산할수있는장점을가지고있다. 또한 MATLAB 은프로그래밍기능뿐만아니라계산및분석결과를쉽게가시화 (GRAPIC) 할수있는기능을통합적으로갖추고있어, 현재공학계산, 데이터분석등공학분야뿐만아니라신호및데이터처리, 통신, 화상처리, 제어, 금융분석등다양한분야에서널리사용되고있다. MATLAB 은초보사용자도쉽게사용할수있도록자세한설명과다양한예제를포함하고있기때문에이교재에는수치해석교과목에사용되는프로그램밍언어로서의 MATLAB 에대한최소한의내용만을포함하고자하였다. 1.1 MATLAB 연산자 (operators) MATLAB 의연산자는다른프로그래밍언어 (C, C++, Pascal 등 ) 와같이세종류의연산자가 있다. 1) 산술연산자 (arithmetic operators): 사칙연산에사용되는연산자 연산기능 연산기호 MATLAB 기호 기능 덧셈 + a+b a+b 뺄셈 a-b a-b 곱셈 a*b a*b 나눗셈 a / b a/b a\b b/a 2) 관계연산자 (relational operators): 배열의구성원소들의 크다, 작다 같지, 같지않다 등크기를비교하는데사용되는연산자로 6 종류가있다. 연산기능연산기호 MATLAB 기호 같다 = = = 다르다 ~ = 82
이하 < = 이상 >= 초과 > > 미만 < < 3) 논리연산자 (logical operators): and, or, true, false 등과같은논리연산에 사용되는연산자로 3 종류가있다 연산기능 연산기호 MATLAB 기호 그리고 AND & 또는 OR 부정 NOT ~ 연산자의우선순위는산술연산자 - 관계연산자 - 논리연산자순이며, ( ) 를사용하여수식에 취하면연산과정에서우선순위를가진다. 우선순위 연산기능 연산기호 1 괄호 ( ) 2 멱승 ^ 3 곱셈, 나눗셈 * / \ 4 덧셈, 뺄셈 + - MATLAB 은프로그램이종료되거나변수값을지우지않는한항상변수의최종값을 저장하고있다. 따라서연산과정중에변수값에새로운값을입력하는것을잊는경우 의도하지않는연산을수행할수있음을명심해야하며, 아래작업세션을관리하는명령어를 유용하게사용하기바란다. 명령어 casesen on casesen off clc clear Exist( F ) who whos 기능대소문자를구별하도록한다대소문자를구별하지않도록한다명령창을지운다 (clear command window) 메모리상의모든변수를제거한다 F 라는이름의변수또는파일이있는지판단한다 ( 있으면 1, 없으면 0) 메모리상에있는별수를나열하여보여준다메모리상에있는변수와크기를나열하여보여준다 83
1.2 MATLAB 함수 (functions) MATLAB 은변수의크기나종류를미리선언할필요가없다. 또한 MATLAB 의가장강력한 기능중의하나는거의모든수학함수를내장함수로포함하고있다는것이다. 함수의종류 명칭 내용 기본함수 elfun 기본적인수학함수 (elementary math functions) 특수함수 specfun 특수기능을가지는수학함수 (specialized math functions) 행렬함수 elmat 행렬처리를위한함수 ( elementary matrices and matrix manipulation) >> help elfun >> help specfun >> help elmat >> lookfor elmat 2. MATLAB 의행렬연산 (matrix operation) 2.1 행렬의구성 MATLAB 의행렬은 square brackets, [ ] 으로표시하며, 열 (column) 의원소들은 comma(,) 또는 blank 로구분하고, 행 (row) 의원소들은 semicolon(;) 으로구분하거나 "enter" 를누르면된다. 구성된행렬의특정행과열의요소를변경하고자하려면, 84
위에서정의된행렬 A 는콜른 ( : ) 연산자를사용해구성할수도있다. 행렬 A 의 3 행의모든행을선택하는경우 : 행렬 A 의 3 열의모든열을선택하는경우 : Colon( : ) 은 MATLAB 연사자중에서가장중요한연산자중하나이다. MATLAB 을얼마나 효율적으로잘사용하느냐는콜른연산자를얼마나잘사용하느냐에달려있다고해도 과언이아니다. 85
정의 기능 A(:, j) A 행렬의 j 번째열 (column) A(i, :) A 행렬의 i 번째행 (row) A(:, :) A 행렬과동일한 2 차원배열 A(j, k) 열벡터의 j 번째원소부터 k 번째까지의원소 A(:, j: k) A 행렬의 j 번째부터 k 번째까지의열벡터 A(:, :, k) 3 차원행렬 A 의 k 번째페이지 (page) 의 A( : ) A 행렬의모든원소를열벡터로배열 2.2 행렬의연산 먼저명심해야할것은 MATLAB 의모든연산과 data 처리는 " 열 (column) 백터 " 방향이다. 86
연산자.* 는행렬 A 와 B 의각원소끼리의곱 (array multiplication) 을의미하며연산결과는 행렬 A, B 와동일한차원을가진다. 87
연산자.\ 는행렬 A 와 B 의각원소끼리의나누기 (array left division) 로 B(i,j)/A(i,j) 에해당하며, 연산자./ 는 A(i,j)/B(i,j) 를의미하며연산결과는행렬 A, B 와동일한차원을가진다. Z' 은행렬 Z 의복소공액 (complex conjugate) 백터의전치를의미하며 Z.' 은행렬 Z 의일반행렬전치를의미한다. MATLAB 이제공하는유용한연산자중왼쪽나숫셈 (left division) 이있다. 역슬레시 (back slash), \ 는 A*x=b 에해당하는선형연립방정식의해를구하는데유용하게사용할수있다. x + 3x + 2x = 1 1 2 3 3x + 5x + 6x = 2 1 2 3 3x + 3x + 4x = 3 1 2 3 1 3 2 x1 1 3 5 6 x = 2 2 3 3 4 x 3 3 = = 1 Ax b x A b 88
A\b 는 A 행렬의역행렬 (inverse matrix, inv(a) 과 b 벡터의곱을의미한다. 오른쪽및왼쪽 나눗셈연산자의구분을명확하게이해하기바라며, 역행렬에대해서는본문의해당단원에서 보다자세히설명되어있다. 2.3 행렬의연산에사용되는다양한기본명령어와기능 MATLAB 은행렬의구성및연산에사용되는다양하고편리한기능을갖추고있으며 대표적인내장함수는다음과같다. 명령어 diag(a) fliplr(a) flipud(a) det(a) eig(a) inv(a) mean(a) std(a) inv(a) 기능행렬의대각요소를선택한다행렬의각열벡터의순서를바꾼다행렬의각행벡터의순서를바꾼다행렬의행렬식 (determinant) 을계산한다행렬의고유값 (eigenvalue) 을계산한다행렬의역행렬을계산한다행렬의각열벡터의평균을계산한다행렬의각열벡터의표준편차를구한다행렬의역행렬을계산한다 89
3. MATLAB 그래프 (grapics) 3.1 2 차원그래프 MATLAB 을이용한수치계산에있어또하나의편리한점은계산및분석결과를바로 그래프를통해보여준다는것이다. 먼저가장기본이되는 2 차원그래프작성예를살펴보자. >> t=[0:2:20]; >> g=9.81; m=68.1; cd=0.25; >> v=sqrt(g*m/cd)*tanh(sqrt(g*cd/m)*t); >> plot(t,v) >> title('free Falling Problem') >> xlabel('time [s]') >> ylabel('velocity [m/s]') >> grid on 여러개의그래프를중복하여함께표시할수있으며선스타일이나색상지정이가능하며, 범례 (legend) 함께표현할수있다. >> x=-pi:pi/20:pi; >> y1=cos(x); >> y2=sin(x); >> plot(x,y1,'-ro',x,y2,'-b') >> h = legend('cos_x','sin_x',2); 90
지정된선스타일, 심볼 (symbol) 및색상을다음과같이구분하여사용할수있다. Symbol Line Style - Solid line (default) -- Dashed line : Dotted line -. Dash-dot line none No line Marker Description + Plus sign o Circle * Asterisk. Point x Cross s or square Square d or diamond Diamond RGB Value name [1 1 0] y (yellow) [1 0 1] m (magenta) [0 1 1] c (cyan) [1 0 0] r (red) [0 1 0] g (green) [0 0 1] b (blue) [1 1 1] w (white) [0 0 0] k (black) 91
앞서설명한바와같이 MATLAB 은초보사용자도쉽게사용할수있도록모든기능에대한 자세한설명과다양한예제를포함하고있으며, Help Browser 를유용하게사용하기바란다. 3.2 특수한형태의그래프 MATLAB 은다양한형태의그래프표현을지원하고있으며, 그중로그 (log) 축으로표현하는방법과극좌표형, 막대형, 계단형그래프등의사용법을살펴보자. 먼저로그좌표축설정을위한아래 3 개형태의명령을사용할수있다. 명령어 loglog(x,,y) semilogx(x,y) semilogy(x,y) 기능 x, y 축을로그좌표로표현한다 x 축을로그좌표로표현한다 y 축을로그좌표로표현한다 92
93
94
3.2 3 차원및기타형태의그래프 3 차원그래프의기본명령어는 plot3 이며, 이를이용하여아래예를작성해보자 95
mesh 명령문을사용하여함수 z=f(x,y) 의표면을나타낼수도있다. 96
4. MATLAB 프로그래밍 4.1 프로그래밍 1 MATLAB 은전용 editor 를제공하며이를이용하여프로그래밍을수행할수있다. MATLAB 실행파일의확장자명칭은 *.m 으로저장된다. 먼저하나의파일에저장된일련의명령어로작성되는 script 파일을작성하는예제를연습해보자 ( 제 1 장참조 ). >> edit scriptdemo.m clear; g=9.81; m=68.1; cd=0.25; t=[0:0.2:20]; v=sqrt(g*m/cd)*tanh(sqrt(g*cd/m)*t); plot(t,v) title('free Fall Problem') xlabel('time [s]') ylabel('velocity [m/s]') grid on 위에서작성된 scriptdemo.m 파일을아래와같이실행시키면연산을수행하고그결과를 그래프로보여준다. >> scriptdemo 97
다음으로함수 (function) 파일을작성해보자. 함수파일은 function 으로시작하며명령창에서 입력인수를받아출력한다. 예를들어본문제 1 장의예제에서몸무게, 항력계수및 낙하시간을입력받아자유낙하속도를계산하는함수파일을작성해보자. >> edit freefallvel.m function velocity = freefallvel(m, cd, t) %freefallvel (m, cd,t) computes the free fall velocity [m/s] %of an object with second order drag. %Input Descriptions % m = mass[kg] % cd = drag coefficient [kg/m] % t = time [s] %Output Description % velocity = free fall velocity [m/s] g=9.81; velocity = sqrt(g*m/cd)*tanh(sqrt(g*cd/m)*t); 다음으로입력변수를받아여러개의변수로출력하는예를살펴보자. 여러데이터를받아 평균을구하고표준편차를출력한다. >> edit stats.m function [mean, stdev]=stats(x) n=length(x); mean=sum(x)/n; stdev=sqrt(sum((x-mean).^2/(n-1))); 98
4.2 프로그래밍 2 사용자로부터명령창에서입력값을받아계산을수행하고결과를파일및그래프로출력하는프로그램을작성해보자. 이는 MATLAB 프로그램밍의가장기본적인형식으로연습을통해다양한예제에적용하여실습하고프로그래밍능력을배양해나가기바란다. % ===== freefallproblem.m ===== % freefallproblem.m computes the free fall velocity % of an object with second order drag. % % Input Description % m: Mass [kg] % cd: Drag coefficient(0.25) [kg/m] % tt: Terminal Time [s] % dt: time distance % % Output Description % vel: velocity [m/s] fid=fopen('free-fall-velocity.dat','w'); g=9.81; m=68.1; cd=0.25; tt=12; dt=0.2; ti=0.0; vi=0.0; disp('free Fall Problem: Exact and Numerical solutions for the free fall problem') %m=input('mass [kg]: '); %cd=input('cd [kg/m]: '); %tt=input('terminal Time [s]: '); %dt=input('time Distance: '); disp('' ) t=ti; av=vi; n=(tt-ti)/dt; for i=1:n ev=sqrt(g*m/cd)*tanh(sqrt(g*cd/m)*t); dvdt=g-(cd/m)*av^2; av=av+dvdt*dt; end T(i)=t; ev(i)=ev; av(i)=av; fprintf(fid,'%3.3f t=t+dt; %3.4f %3.4f\n',T(i),eV(i),aV(i)); 99
plot(t,ev,'-r',t,av,'--') title('free Fall Exact Solution') xlabel('time [s]') ylabel('velocity [m/s]') legend('exact Solution', 'Numerical Solution') grid on fclose(fid); 설명 : % ===== freefallproblem.m ===== C 언어처럼 % 이후의문자또는문장은주석 ( 설명 ) 문으로인식하며프로그램시작전 해당프로그램에대한사용자설명문과주요변수에대에설명해놓을수있다. 설명문을 꼼꼼하게적어두면나중에프로그램을사용하거나다른사용자에게편리할수있으므로평소 자세히기록해두는습관을들이도록하자. 100
fid=fopen('free-fall-velocity.dat','w'); 프로그램중데이터파일의입출력에사용하는명령어로, 저장또는읽는데사용할파일 명칭과기능을설정해준다. 명령어 r w a r+ w+ a+ 설명읽기용파일임을지정 (default) 쓰기용파일을새롭게생성하고결과를기록한다기존데이터파일에덧붙여쓴다읽을파일을열고쓰기를한다읽을파일을열고쓰기를한다읽을파일을열고쓰며기존파일에덧붙여쓴다 fclose(fid); 파일입출력명령을종료해준다. disp('free Fall Problem: Exact and Numerical solutions for the free fall problem') 명령창에해당문장의보여준다 fprintf(fid,'%3.3f %3.4f %3.4f\n',T(i),eV(i),aV(i)); 위에서지정한출력파일에데이터를기록하는명령어로 fprintf 함수에사용하는 포멧코드 (format code) 와제어코드 (control code) 는아래와같다. 포멧코드 %c %d %e %E %f %g 설명단일문장기호 Decimal notation 지수함수로표시 (e) 3.1e+01 지수함수로표시 (E) 3.1E+01 지정된소수로표시 %3.3f: 소수 3 자리까지표시 Insignificant zeros do not print 제어코드 \b \f \n \t Backspace Form feed New line Horizontal tab 설명 101