MATLAB 서론 MATLAB Version 7 (R14) Why MATLAB 배우기쉽다. 반나절정도만투자하면배울수있다. VBA 와유사하며, 프로그래머가많이신경쓰지않아도된다. 예를들어, [1] 변수선언이필요없다. [2] 배열관리가간단하다. 그밖의장점은다음과같다. 그래프기능이강력하다. 최적화함수가탑재되어있다. 그림 (1.1) 기본경로설정 1
그림 (1.2) 환경설정 DOS 처럼쓰기 clear x; x변수를메모리에서지우라. clear all; clear; clc; command prompt를지운다. echo on; M-file 명령어가 command prompt로출력된다. echo off; M-file 명령어가 command prompt로출력되지않는다. 기본설정은 echo off delete(1); figure no.1 창을닫는다.!dir/w; 도스창이뜨면서디렉토리를보여준다.!notepad; 시작 > 실행에서 notepad를치는것과같다. dir, cd, type 등을느낌표없이사용해보자. lookfor inverse; help와비슷하다. what; 현재디렉토리에있는 m-file 목록을보여준다. open ; 파일또는변수를연다. MATLAB 에서사용되는기호 ;Symbols Part 1. 행렬다루기 0 표기 (Notation) 와정의 0.1. MATALB 화면구성 과관련된용어 2
작업공간 ; Workspace 명령창 ; Command Window 명령기록 ; Command History 배열편집 ; Array Editor 그림 (1.3) MATLAB 화면구성 1 행렬조작 1.1. 개요 Matrix 연산을위해만들어졌다. 따라서행렬조작을이해하는것이첫번째할일이다. 문제다음행렬을입력하라. 1 2 a = 5 9 6 10 13 14 입력 >> a=[1,2,3,4;5,6,7,8;9,10,11,12;13,14,15,16] 3 4 7 11 8 12 15 16 출력 a = 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 문제행렬의요소에접근하기풀이 >> a(1,2) >> a(1:2,2:3) >> a(3,:) 3
2 2 3 6 7 9 10 11 12 문제날짜순 ( 내림차순 ) 으로된데이터 X 에서 y = α + βy + ϵ 의회귀분석을하려고한다. y 벡터와 y 벡터를만들라. 2 파일로부터데이터읽어오기 텍스트파일로부터데이터를읽어오고자한다. 미리작성해둔텍스트파일은다음과같다. :reading_file.txt 1 2 2 5 3 10 4 17 5 26 다음과같이명령창에입력하자. 입력 >> load reading_file.txt 출력 그림 (1.4) reading_file.txt 을읽어들인결과화면 읽어들인데이터는 reading_file 이라는이름의행렬로저장된다. 즉, 다음을실행해보자. >> reading_file(3,:) 3 10 4
문제위에서읽어들인데이터를열 (column) 별로 x, y 라는벡터에입력해보자. 풀이 >> x=reading_file(:,1); >> y=reading_file(:,2) 실습폴더를지정해서텍스트파일읽어오기 dirname=['c:\documents and Settings\feel\My Documents\MATLAB']; loadname=[dirname '\text.txt']; load(loadname) 실습엑셀파일읽어오기 01_clc 02_clear 03_tmp_dirName=['D:\_kaist\_ 재무계량분석 \mid_term']; 04_tmp_fileName=[tmp_dirName '\data_edited.xls']; 05_sheet=2; 06_xDATE=xlsread(tmp_fileName,sheet,'b2:b961'); 07_num_data=size(xDATE,1); 08_num_exp_variable=7; 09_y=ones(num_data-1,num_exp_variable); 10_x=ones(num_data-1,num_exp_variable); 11_ascii = char(reshape(32:127, 32, 3)'); %alphabet 12_for(i=1:num_exp_variable) 13_ tmp_range=[ascii(2,i+3) '3:' ascii(2,i+3) '961']; 14_ y(:,i)=xlsread(tmp_filename,sheet,tmp_range); %965' DEF 15_ tmp_range=[str(i) '2:' str(i) '960']; 16_ x(:,i)=xlsread(tmp_filename,sheet,tmp_range); %965' DEF 17_end 18_ 19_flipud(y); 11_str=['c';'d';'e';'f';'g';'h';'i']; 2 특수한행렬 rand >> rand(3) 0.8147 0.9134 0.2785 0.9058 0.6324 0.5469 0.1270 0.0975 0.9575 randn >> randn(2,3) 1.1892 0.3273-0.1867-0.0376 0.1746 0.7258 3 벡터의입력 3.1. 대괄호를이용한입력벡터의요소는쉽표 (,), 공백, 세미콜론 (;) 으로구분한다. 3.2. 콜론을이용한입력 5
다음을입력해보자. 입력 >> a=1:2:10 a = 1 3 5 7 9 즉, 변수명 = 시작값 : 증분 : 종료값 의형식으로간단히벡터를만들수있다. 4 배열연산 입력 >> t=0:0.1:10; >> x=exp(-0.5*t).*sin(0.5*t); >> plot(t,x) 결과 그림 (1.5) 배열연산출력결과 배열연산의이해 t 벡터의 1 번째요소로수식계산 x 벡터의 1 번째요소 t 벡터의 n 번째요소로수식계산 x 벡터의 n 번째요소따라서 x 는 t 벡터와크기가동일하다. 5 스칼라연산 특이한것은 우측나누기 라는것이있다는것 : b\a= 참조우측나누기가필요한이유 행렬에서보면 A B = 로생각할수있는데, MATLAB 에서이식을 A\B 로쓸 수있게지원하기때문에, 스칼라연산에도이방식이적용된것이다. 나머지연산자는엑셀과같다. 6
6 행렬연산 6.1. 행렬더하기와빼기상식과같다. 두행렬의차원이같아야정의된다. 수학에서는행렬 (A) 과스칼라 (b) 의더하기는정의되지않지만, MATLAB 에서는다음과같은의미에서정의된다. A + b = A + bi 6.2. 행렬의곱하기상식과같다. 6.3. 행렬의나누기 (1) 역행렬 >> A=[1,2;3,4]; >> inv(a) -2.0000 1.0000 1.5000-0.5000 (2) 나누기다음의의미에서나누기가정의된다. A / B AB : 왼쪽나누기 A\B A B : 오른쪽나누기 6.4. 행렬의거듭제곱지수 (power) 가양의정수인경우는상식과같다. 지수가양수가아닌경우에도다음의의미에서정의된다. Find A. such that solves A = A. A. 연구지수가양의정수가아닌경우 6.5. 행렬의조작 rot90(matrix) rot90(matrix,integer) fipud(matrix) ; flip upside-down fiplr(matrix); fiip left-to-right reshape(matrix,m,n) transpose 또는 A 라고해도된다. 즉 transpose(a)=a 입력 >> rot90(a) 2 4 1 3 7 배열연산정의 Array operation(.*,*/,*\,*^) 행렬의요소에대해곱셈, 나눗셈, 지수연산을하고자할때적용되는연산 ( 함수 ) 7
노트 [1] 더하기와빼기는원래연산이요소별 (pairwise) 더하기 / 빼기로정의되므로배열연산이불필요하다. [2] 배열연산이정의되기위해서는두행렬의차원이같아야한다. a = [1 2 3 4] 와 b = [5,4,3,2] 의요소별곱 (pairwise product) 를하고자한다. 다음을실습해보자. >> a=[1 2 3 4]; >> b=[5,4,3,2]; >> a.*b 5 8 9 8 문제배열연산을이용해서다음두벡터의내적을계산하라. a = [1 2 3], b = [3, 0, 1] 풀이 >> a=[1 2 3]; >> b=[3,0,-1]; >> sum(a.*b) 0 위풀이는간단히 dot(a,b) 로도쓸수있다. 참고로외적은 cross(a,b) 이다. 활용배열연산이많이쓰이는경우배열연산을이용하면반복문 (for, while) 을간단히쓸수있다. 다음을보자. MATLAB C++ >> x=0:0.1:10; for(i=0;i<=100;i++){ >> y=x.^3; x[i]=i/100; >> plot(x,y) y[i]=x[i]^3; } 문제다음그래프를그려보라. y = exp x sin x, x [0,10] 풀이 >> x=0:0.1:10; >> y=exp(-0.5*x).*sin(5*x); >> plot(x,y) 8
Part 2. 그래프 1 기본적그래프그리기 plot 을사용한다. 다음을따라해보자. 01_function rtn=graphxy() 02_ x=0:0.1:10; 03_ y=(x+2).*(x-5).*x; 04_ plot(x,y); 05_ xlabel('this is x'); 06_ ylabel('this is y'); 07_ title('this is my first graph'); 08_ legend('x_data'); 09_ gtext('\leftarrow y=x(x+2)(x-5)'); 10_end 08 x_a 라고쓰면 x 로나타난다. 즉 tex 타입의수식입력이가능하다. 09 gtext 는마우스로텍스트가나타날곳을지정해줄수있는함수이다. 2 하나의그림창에여러개의그래프그리기 subplot 을사용하면된다. subplot(m,n,i) 또는 subplot(mni) 하나의창을 m n 개의영역으로나누고 i 번째영역을활성화한다. 문제 4 개의하부영역을만들고각각에아래함수의그래프를그려보자. y = x, y = x, y = x, y = x 단, x [ 5,5] 명령창 >> x=-5:0.1:5; >> f1=x; >> f2=x.^2; >> f3=x.^3; >> f4=x.^4; >> subplot(221); >> plot(x,f1); >> subplot(222) >> plot(x,f2) >> subplot(223) >> plot(x,f3) >> subplot(224) >> plot(x,f4) 문제 subplot 세번째창을활성화하여그리드 (grid) 를넣어보라. subplot(223); grid on 3 이중축그래프그리기 plotyy(x1,y1,x2,y2) 문제다음두개의함수를하나의창에그려보라. 9
y = exp(x), y = ln(x) 단, x [0,1] 명령창 01_>> x=0:0.1:10; 02_>> f1=exp(x); 03_>> f2=log(x); 04_>> figure(2) 05_>> plotyy(x,f1,x,f2) 04 새로운창 (2) 을연다. 4 여러그래프를하나의창에그리기 정의 CSM 그래프선의요소 ; Color, (Line) Style, Marker C c,m,y,r,g,b,w,k S -,--,none,:,-. M +,^,O,*,.,x,square,diamond, v,>,<,pentagram,hexagram,none 문제위문제의그래프를하나의창에그려보라 01_>> plot(x,f1,'b-',x,f2,'b:') 02_>> plot(x,f1,'-',x,f2,':') 03_>> plot(x,f1,x,f2) 01_ 파란색선 & 실선으로첫그래프를, 파란색선 & 점선으로두번째그래프를그림 02_ 색을지정하지않으면, 임의로색을지정 03_ 아무것도지정하지않을수도있다. 5 3 차원그래프 plot3(x,y,z) contour(x,y,z,n); N= 등고선의개수 10
mesh(x,y,z,c) C; 생략가능 surf(x,y,z,c) 문제 3 차원그물형그래프그리기 >> x=0:1:50; >> y=0:0.1:10; >> [X,Y]=meshgrid(x,y); >> Z=exp(-0.05*X).*sin(1.5*Y); >> mesh(x,y,z) 11
Part 3. 프로그래밍 0 무작정따라하기 1 File>New>M-File 을선택한다. 2 편집창이열리면, 왼쪽과같이입력한다. 3 File>Save 를선택해서저장한다. 4 MATLAB 화면으로 >> result=determinant(2,3,4); 돌아와서 명령창에 >> result 왼쪽처럼쓴다. 5 결과는다음과같다. result = -23 질문 [1]m-file 은아무곳에저장해도되는가? [2]m-file 은반드시저장하고실행해야하는가? [3]m-file 이름과함수이름은같아야하는가? [4] 변수선언 ( 데이터타입, 배열의크기등 ) 은필요없나? [5]m-file 에는함수가하나만있어야하는가? 정의 M-file 주목적 외부예서값을받아연산 / 처리후외부로값을넘겨줌 ( 함수 ) 파일명 가급적 함수이름 과같도록지정 구조 function 출력변수명 = 함수이름 ( 입력변수 ) 함수본문 end 변수범위 global M-file과 workspace에서모두사용가능 local M-file에서만의미있음 1 산술연산자앞에서언급한바와같다. 12
2 관계연산자 C++ 관계연산자와같다. 같지않다 만다르다. MATLAB C++ ~=!= 3 논리연산자 C++ 과같다. ~ 이아니다 ( 부정 ) 연산자만다르다. 4 비트연산자아직까지는불필요. 5 IS 함수 isfinite; isinf; isnan; isequal; isnumeric; isreal; isglobal; 6 문자열의처리 abs; double; isstr; strcmp; C++ upper; lower; [string1,string2] ischar; num2str; int2str; str2double; 연구 eval 함수 7 GUI 프로그램수행중에잠시기다리라는메시지를보여주고싶다. 다음함수를이용하면된다. msgbox( message, title, icon ) 입력 >> msgbox('wait a moment','message') 8 파일입출력 13
9 제어문 9.1. if 문 9.2. switch 문 9.3. while 문 9.4 for문 for문은벡터로대체가능하다. 다음을보자. for문벡터문 >> n=1; >> x=1:0.1:10; >> for(x=1:0.1:10) >> y=x.^2; y(n)=x.^2; n=n+1; end 벡터로처리한것이간결하고속도도빠르다. 9.5. 기타유용한함수 error warning disp input break return 9.6. 디버깅 10 Tips 요구메모리를모두지우고싶다. clear Remove items from workspace, freeing up system memory Part 4 Application 1 기호연산 주의 Symbolic math toolbox 가필요하다! 14
2 Numerical Analysis 수치적방법을이용한분석 / 해석 2.1. 해찾기 (solver) 사용가능한함수의종류 함수명 설명 엑셀 fzero 1 변수방정식의해 목표값찾기 fsolve 최소자승법 (Least Square) 에의한비선형 해찾기 연립방정식의해 solve 연립방정식의기호적 (symbolic) 해 문제 f = x + 2x + 1 의해를찾아보자.. 풀이 [1]m-file: ts_optm.m 01_function f=ts_optm(x) 02_ f=x.^3+2*x+1; 03_end 01_x 가스칼라면어떻게될까? [2] 명령창 >> x=fzero( ts_optm,1) x = -0.4534 문제다음비선형연립방정식의해를구하라. 2x x e = 0 x + 2x e = 0 풀이 [1]m-file; ts_nonlin_optm.m 01_function f=ts_nonlin_optm(x) 02_ f=[2*x(1)-x(2)-exp(-x(1)); 03_ -x(1)+2*x(2)-exp(-x(2))]; 04_end [2] 명령창 >> x0=[-5;5]; >> x=fsolve( ts_nonlin_optm,x0) Optimization terminated: first-order optimality is less than options.tolfun. x = 0.5671 0.5671 2.2. 보간법 문제 1 차원선형보간 [1]M-file function f=ts_linintp() x=[3 91]; y=[4.5 4.7]; f=interp1(x,y,32); end 결과 4.5659 15
문제 Cubic spline Syntax pp = spline(x,y)yy = spline(x,y,xx) 예제 x = 0:10; y = sin(x); xx = 0:.25:10; yy = spline(x,y,xx); plot(x,y,'o',xx,yy) 2.3. 최적화 fminbnd(fun 1,x1,x2) ; 입력변수가스칼라이고, 출력변수가스칼라인경우사용 문제다음함수의최소값을구하라. 단, x [0,2] f = x 2x 5 풀이 01_>> f = @(x)x.^3-2*x-5; 02_>> x = fminbnd(f, 0, 2) 03_x = 04_ 0.8165 01_Anonymous function 을보라. 문제다음함수의최소값을구하라. y = x 2x 5 풀이 [1]M-file function y=myfun(x) y=x.^2-2*x-5; end [2] 명령창 1 fun is the function to be minimized. fun accepts a scalar x and returns a scalar f, the objective function evaluated at x. The function fun can be specified as a function handle for an M-file function x = fminbnd(@myfun,x1,x2); where myfun.m is an M-file function such as function f = myfun(x) f =... % Compute function value at x. or as a function handle for an anonymous function:x = fminbnd(@(x) sin(x*x),x1,x2); 16
>> x=fminbnd(@myfun,-2,2) x = 1.0000 x0: 초기값 문제다음함수의최소값을구하라. f(x ) = 100(x x ) + (1 x ) 풀이명령창 >> banana = @(x)100*(x(2)-x(1)^2)^2+(1-x(1))^2; >> [x,fval] = fminsearch(banana,[-1.2, 1]) x = 1.0000 1.0000 fval = 8.1777e-010 3 서브함수정의메인함수 m-file 제일위에있는함수 정의서브함수메인함수를제외한 m-file 내의함수 4 전역변수 정리 m-file 내의함수는기본적으로지역변수로설정된다. 10 프로그램예제 문제균등분포확률변수두개의산포도를그려보라. 풀이 17
01_function rtn=graphxy() 02_ x=rand(1,100); %row vector 03_ y=rand(1,100); 04_ plot(x,y,'x'); 05_ xlabel('this is x'); 06_ ylabel('this is y'); 07_ title('this is my first graph'); 08_end 02 column vector 여도상관없다! 예를들어, x=rand(100,1); 04 marker 를 X 로선택한다. 문제 1 부터 n 까지합구하기 function f=func(n) sum=0; for(i=1:1:n) sum=sum+i; end f=sum end 문제 1. 변수의차원을설정하는방법은? 2. 원소가모두 1 인행렬만들기 >> ones(3) 1 1 1 1 1 1 1 1 1 3. row vector or column vector? function tmp=test() for(i=1:1:10) tmp(i)=i; end tmp 는 row vector 이다! 문제지수분포함수와확률밀도함수를그려라 (λ = 0.5) 풀이 문제블랙숄즈공식 function out=bso(pc,s,k,r,t,v) d1=log(s/k)+(r+v^2/2)*t; d1=d1/(v*sqrt(t)); d2=d1-v*sqrt(t); out=pc*s*normcdf(pc*d1)-pc*k*exp(-r*t)*normcdf(pc*d2); end 다음이실행되지않는이유는? 18
k=1:1:100; y=bso(1,100,k,0.05,1,0.2); x=0:0.1:10; lambda=0.5; y=lambda*exp(-lambda*x); Y=1-exp(-lambda*x); plot(x,y,x,y); %plot(x,y,'-ro',x,y,'-.b'); legend('density','distribution'); legend('boxoff') Part 5. 함수목록 mean sum 참고자료 [1] 김용수 (2002), MATLAB 입문과활용, 높이깊이 [2]B. Hunt et al (2001), A Guide to MATLAB for Beginners and Experienced Users, Cambridge University press 19