19
MATLAB.docx 1 MATLAB 서론 MATLAB Version 7 (R14) Why MATLAB 배우기 쉽다. 반나절 정도만 투자하면 배울 있다. VBA유사하며, 프로그래 머가 많이 신경쓰지 않아도 된다. 예를 들어, [1]변수 선언이 필요없다. [2]배열관리가 간단하다. 밖의 장점은 다음과 같다. 그래프 기능이 강력하다. 최적화 함수가 탑재되어 있다. 그림(1.1) 기본경로 설정

MATLAB - Kicheon Changkitchen.dothome.co.kr/MATLAB.pdf · 2009-05-16 · MATLAB.docx 1 MATLAB 서론 MATLAB Version 7 (R14) Why MATLAB 배우기 쉽다. 반나절 정도만 투자하면

Embed Size (px)

Citation preview

MATLAB.docx

1

MATLAB 서론 MATLAB Version 7 (R14) Why MATLAB 배우기 쉽다. 반나절 정도만 투자하면 배울 수 있다. VBA와 유사하며, 프로그래머가 많이 신경쓰지 않아도 된다. 예를 들어, [1]변수 선언이 필요없다. [2]배열관리가 간단하다. 그 밖의 장점은 다음과 같다. 그래프 기능이 강력하다. 최적화 함수가 탑재되어 있다.

그림(1.1) 기본경로 설정

MATLAB.docx

2

그림(1.2) 환경설정

DOS처럼 쓰기 clear x; clear all; clear;

x변수를 메모리에서 지우라.

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 화면구성’과 관련된 용어

MATLAB.docx

3

그림(1.3) MATLAB화면구성

작업공간; Workspace 명령창; Command Window 명령기록; Command History 배열편집; Array Editor

1행렬조작 1.1. 개요 Matrix연산을 위해 만들어졌다. 따라서 행렬 조작을 이해하는 것이 첫 번째 할 일이다. 문제 다음 행렬을 입력하라.

a =1 25 6 3 4

7 89 10

13 14 11 1215 16

입력 >> a=[1,2,3,4;5,6,7,8;9,10,11,12;13,14,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,:)

MATLAB.docx

4

ans = 2

ans = 2 3 6 7

ans = 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,:) ans = 3 10

MATLAB.docx

5

문제 위에서 읽어들인 데이터를 열(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) ans = 0.8147 0.9134 0.2785 0.9058 0.6324 0.5469 0.1270 0.0975 0.9575 randn >> randn(2,3) ans = 1.1892 0.3273 -0.1867 -0.0376 0.1746 0.7258

3 벡터의 입력 3.1. 대괄호를 이용한 입력 벡터의 요소는 쉽표(,), 공백, 세미콜론(;)으로 구분한다. 3.2. 콜론을 이용한 입력

MATLAB.docx

6

다음을 입력해보자. 입력 >> 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”로 쓸 수 있게 지원하기 때문에, 스칼라 연산에도 이 방식이 적용된 것이다. 나머지 연산자는 엑셀과 같다.

MATLAB.docx

7

6 행렬연산 6.1. 행렬더하기와 빼기 상식과 같다. 두 행렬의 차원이 같아야 정의된다. 수학에서는 행렬(A)과 스칼라(b)의 더하기는 정의되지 않지만, MATLAB에서는 다음과 같은 의미에서 정의된다.

A + b = A + bI 6.2. 행렬의 곱하기 상식과 같다. 6.3. 행렬의 나누기 (1)역행렬 >> A=[1,2;3,4]; >> inv(A) ans = -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) ans = 2 4 1 3

7 배열연산 정의 Array operation(.*,*/,*\,*^) 행렬의 요소에 대해 곱셈, 나눗셈, 지수연산을 하고자 할 때 적용되는 연산(함수)

MATLAB.docx

8

노트 [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 ans = 5 8 9 8 문제 배열연산을 이용해서 다음 두 벡터의 내적을 계산하라. a = [1 2 3], b = [3, 0, −1] 풀이 >> a=[1 2 3]; >> b=[3,0,-1]; >> sum(a.*b) ans = 0 위 풀이는 간단히 “dot(a,b)”로도 쓸 수 있다. 참고로 외적은 “cross(a,b)”이다. 활용 배열연산이 많이 쓰이는 경우 배열연산을 이용하면 반복문(for, while)을 간단히 쓸 수 있다. 다음을 보자. MATLAB C++ >> x=0:0.1:10; >> y=x.^3; >> plot(x,y)

for(i=0;i<=100;i++){ x[i]=i/100; y[i]=x[i]^3;

} 문제 다음 그래프를 그려보라. y = exp − x × sin 푥 , x ∈ [0,10] 풀이 >> x=0:0.1:10; >> y=exp(-0.5*x).*sin(5*x); >> plot(x,y)

MATLAB.docx

9

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) 문제 다음 두 개의 함수를 하나의 창에 그려보라.

MATLAB.docx

10

y = exp(푥), y = ln(푥) 단, 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=등고선의 개수

MATLAB.docx

11

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)

MATLAB.docx

12

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 산술연산자 앞에서 언급한 바와 같다.

MATLAB.docx

13

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파일입출력

MATLAB.docx

14

9 제어문 9.1. if문 9.2. switch문 9.3. while문 9.4 for문 for문은 벡터로 대체 가능하다. 다음을 보자. for문 벡터문 >> n=1; >> for(x=1:0.1:10) y(n)=x.^2; n=n+1; end

>> x=1:0.1:10; >> y=x.^2;

벡터로 처리한 것이 간결하고 속도도 빠르다. 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가 필요하다!

MATLAB.docx

15

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 결과 ans = 4.5659

MATLAB.docx

16

문제 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(fun1,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);

MATLAB.docx

17

>> 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프로그램 예제 문제 균등분포 확률변수 두 개의 산포도를 그려보라. 풀이

MATLAB.docx

18

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) ans = 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 다음이 실행되지 않는 이유는?

MATLAB.docx

19

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