MATLAB 프로그래밍
MATLAB MATLAB이란? 특징 mathworks 사(http://www.mathworks.com) 개발 수치해석 및 프로그래밍 환경을 제공하는 공학용 툴 특징 행렬 처리 용이 함수와 데이터의 그래프 표현 사용자 인터페이스 생성 및 다른 프로그래밍 언어 연결 가능 다양한 내장 함수 및 툴박스 제공 플랫폼 독립적
MATLAB 데스크탑
MATLAB 스칼라 값 배정 소수점이하 15자리까지 표현 소수점이하 4자리까지 표현
MATLAB 벡터, 행렬 행 벡터 열 벡터 행렬 a = [ 1 2 3 4 5 ] c = [ 1 2 3 ; 4 5 6 ; 7 8 9 ] c(2,3) (행번호, 열번호) 6출력
MATLAB 벡터, 행렬 콜론(:) 연산자 1부터 5까지 1씩 증가하는 행벡터 1부터 3까지 0.5씩 증가하는 행벡터 인덱스 2~4까지의 벡터 추출
MATLAB 벡터, 행렬 콜론(:) 연산자 2행, 인덱스 생략 3행, 1열과 2열 2~3행, 1~2열로 구성된 2x2 행렬 반환
MATLAB 벡터, 행렬 linspace(x1, x2, n) logspace(x1, x2, n)
MATLAB 벡터, 행렬 eye(n) zeros(n,m) ones(n,m) … nxn 단위행렬(identity matrix) nxm 0행렬 ones(n,m) mxm 행렬(모든 원소의 값이 1) …
수학 연산 >> y = pi / 4 >> -y^2.45 >> (-y)^2.45 우선순위 연산자 설명 1 ^ 지수 계산 2 - 음부호 3 * / 곱셈, 나눗셈 4 \ 왼쪽 나눗셈(행렬 연산) 5 + - 덧셈, 뺄셈 >> y = pi / 4 >> -y^2.45 >> (-y)^2.45
행렬 연산 Operation MATLAB Form Comments Array Addition a + b Array addition and matrix addition are identical Array Subtraction a – b Array subtraction and matrix subtraction are identical Array Multiplication a . * b Element-by-element multiplication of a and b. Both arrays must be the same shape, or one of them must be a scalar Matrix Multiplication a * b Matrix multiplication of a and b. The number of columns in a must equal the number of rows in b. Array Right Division a ./ b Element-by-element division of a and b : a(i,j) / b(i,j). Both arrays must be the same shape, or one of them must be a scalar. Array Exponentiation a. ^ b Element-by-element exponentiation of a and b : a(i,j) ^ b(i,j). Both arrays must be the same shape, or one of them must be a scalar
행렬 연산 예제 덧셈/뺄셈 곱셈 외적(outer product) a = [ 1 2 3 4 5 ]; b = [ 2 4 6 8 10]; c = a + b 곱셈 a = [ 1 2 3 4 5 ]; b = [ 2 4 6 8 10 ]’ c = 2 * a a*b 외적(outer product) b * a
행렬 연산 예제 지수 정방행렬 ^지수승 배열 연산자(.연산자) 각 원소끼리 연산 .* ./ .^
내장 함수 Trigonometric Functions >> sqrt(2) ans = 1.4142 Function Description cos(x) Calculates cos x, with x in radians. acos(x) Calculates cos-1x, with the results in radians. sin(x) Calculates sin x, with x in radians. asin(x) Calculates sin-1x, with the results in radians. tan(x) Calculates tan x, with x in radians. atan(x) Calculates tan -1x, with the results in radians. mod(x,y) Remainder, or modulo, function. sqrt(x) Calculates the square root of x. >> sqrt(2) ans = 1.4142
내장 함수 Round, Exponential, Logarithm Function Description [value,index] = max(x) Returns the maximum value in vector x, and optionally the location of that value. [value,index] = min(x) Returns the minimum value in vector x, and optionally the location of that value. ceil(x) Rounds x to the nearest integer towards positive infinity : ceil ( 3.1 ) = 4 and ceil ( -3.1 ) = -3 fix(x) Rounds x to the nearest integer towards zero : fix ( 3.1 ) = 3 and fix ( -3.1 )= -3 floor(x) Rounds x to the nearest integer towards minus infinity : floor ( 3.1 ) = 3 and floor ( -3.1 ) = -4 round(x) Rounds x to the nearest integer exp(x) Calculates ex. log(x) Calculates the natural logarithm log e x. log2(x) Calculates the natural logarithm log 2 x.
내장 함수 Complex & Rational Numbers Help help 함수명 Function Description abs(x) Calculates |x|. angle(x) Returns the phase angle of the complex value x, in radians conj(z) Calculates conjugate of z. imag(z) Calculates imaginary part of z. real(z) Calculates real part of of z. rat(x) Calculates rational approximation of x rats(x) Calculates rational output of x
함수 활용 예 자유낙하 속도 측정 t=[0:2:20]’; g=9.81; m=68.1; cd=0.25; v=sqrt(g*m/cd)*tanh(sqrt(g*cd/m)*t) v : 속도(m/s) g : 중력가속도(9.81m/s2) m : 질량(kg) cd : 항력계수(kg/m) t : 시간(s) v = 18.7292 33.1118 42.0762 46.9575 49.4214 50.6175 51.1871 51.4560 51.5823 51.6416
그래픽 표현 Figure plot stem stairs bar compass pie semilog semilogx semilogy plot stem stairs bar compass pie
그래픽 표현 Label Title Legend xlabel (‘x_string’) ylabel (‘y_string’) title (‘string’) Legend Legends can be created with the legend function. The basic form of this function is legend(‘string1’, ’string2’, . . . , pos) pos 설명 Automatic “best” placement (least conflict with data) 1 Upper right-hand corner (default) 2 Upper left-hand corner 3 Lower left-hand corner 4 Lower right-hand corner -1 To the right of the plot
그래픽 표현 Colors & Styles Color Marker Style Line Style y yellow . point - solid m magenta o circle : dotted c cyan x x-mark -. dash-dot r red + plus -- dashed g green * star <none> no line b blue s square w white d diamond k black v triangle (down) ^ triangle (up) < triangle (left) > triangle (right) p pentagram h hexagram no marker
그래픽 표현 x=0:pi/100:2*pi; y1=sin(2*x); y2=2*cos(2*x); plot(x,y1,'k-o',x,y2,'b--v') title('Plot of f(x)=sin(2x) and its derivative') xlabel('x') ylabel('y') legend('f(x)','d/dx f(x)',4) grid on
그래픽 표현 사랑의 방정식 x=[-4.15:0.001:4.15]; a=17; b=-16*abs(x); c=17*x.^2 - 225; y1=(-b+sqrt(b.^2 - 4*a.*c))/(2*a); y2=(-b-sqrt(b.^2 - 4*a.*c))/(2*a); plot(x,real(y1)) hold on plot(x,real(y2)) grid on
스크립트 파일 M-파일 작성 scriptdemo.m g=9.81; m=68.1; t=12; cd=0.25; v=sqrt(g*m/cd)*tanh(sqrt(g*cd/m)*t) >> scriptdemo
함수 파일 함수 형식 function outvar = funcname(arglist) % help comments 예제) freefallvel.m function velocity = freefallvel(m,cd,t) % 자유낙하 속도 계산 % 입력) m:질량(kg), cd:항력계수, t:시간(초) % 출력) t초 후 낙하 속도 출력 g = 9.81; velocity=sqrt(g*m/cd)*tanh(sqrt(g*cd/m)*t); >> freefallvel(68.1, 0.25, 12) function outvar = funcname(arglist) % help comments statements outvar = value
여러 개의 값 반환 stats.m function [ mean, stdev ] = stats (x) n = length(x); mean = sum(x) / n; stdev = sqrt ( sum((x-mean).^2 / (n-1))); >> y = [ 8 5 10 12 6 7.5 4 ] >> [ m , s ] = stats(y) m = 7.5000 s = 2.8137
input 함수 형식 설명 예제 n = input(‘prompt string’) m = input(‘Mass (kg): ’) >> Mass (kg): 68.1_ name = input(‘Enter your name: ’,‘s’) % 문자열 입력 >> enter your name: Matlab_
disp 함수 형식 disp( value ) 설명 명령창에 value 값 출력 예제
fprintf 함수 형식 설명 포맷 / 제어 코드 fprintf( ‘ format ’, arglist … ) %d 정수 포맷 %e e를 사용하는 과학 포맷 %E E를 사용하는 과학 포맷 %f 소수 포맷 %g %e나 %f 중에서 간단한 포맷 \n 새로운 줄로 시작 \t 탭
fprintf 예제 fprintfdemo.m function fprintfdemo x = [ 1 2 3 4 5 ]; y = [ 20.4 12.6 17.8 88.7 120.4 ]; z = [ x ; y ]; fprintf(‘ x y \n’); fprintf(‘ %5d %10.3f \n’, z); 결과 1 20.400 2 12.600 3 17.800 ……
대화식 M-파일 작성 freefallinteract.m 실행 function velocity = freefallinteract g = 9.81; m = input( ‘무게(kg) : ’); cd = input( ‘항력계수(kg/m) : ’); t = input( ‘시간(s) : ’); disp( ‘낙하속도 (m/s) : ’ ) disp( sqrt(g*m/cd)*tanh(sqrt(g*cd/m)* t) ) 실행 >> freefallinteract 무게(kg) : 68.1 항력계수(kg/m) : 0.25 시간(s) : 12 낙하속도(m/s) : 50.6175
함수호출 freefallinteract.m 수정 function velocity = freefallinteract m = input( ‘무게(kg) : ’); cd = input( ‘항력계수(kg/m) : ’); t = input( ‘시간(s) : ’); disp( ‘낙하속도 (m/s) : ’ ) disp( freefallvel(m,cd,t) ) freefallvel.m의 freefallvel함수를 호출
관계/논리 연산 관계연산자 논리 연산자 x == 0 == Equal unit ~= ‘m’ ~= Not equal < Less than s > t > Greater than 3.9 <= a / 3 <= Less than or equal to r >= 0 >= Greater than or equal to ~x ~ Not x & y & And x | y | Or
판정 : if 구문 형식 설명 예제 if condition statements end if grade >= 60 disp( ‘ passing grade: ’ ) disp( grade ); if grade >= 60, disp( ‘ passing grade: ’ ), end
에러함수 : error 형식 설명 예제 error( msg ) 텍스트 메시지 msg를 출력하고 m-파일 종료 if x == 0, error(‘Zero value encountered’), end f = 1 / x;
if / else 구문 mysign.m function sgn = mysign (x) % mysign(x) : return 1 if x is greater then zero % -1 if x is less then zero % 0 if x is equal to zero if x > 0 sgn = 1; elseif x < 0 sgn = -1; else sgn = 0; end
for 구문 형식 설명 예제 for index = start : step : finish statements end index값을 start부터 finish까지 step씩 증가/감소 시키면서 statements를 반복 실행 예제 i = 0; for t = 0:0.02:50 i = i + 1; y(i) = cos(t) t = 0:0.02:50; y = 5 * cos(t)
메모리 사전 할당 t = 0:0.01:5; for i = 1:length(t) if t(i) > 1 y(i) = 1 / t(i); else y(i) = 1; end t = 0:0.01:5; y = ones( size(t) ); for i = 1:length(t) if t(i) > 1 y(i) = 1 / t(i); end 배열의 크기가 예측 가능하면 미리 메모리를 할당
while 구조 형식 설명 예제 while condition statements end while x > 0 while(1) x = x – 3; if x < 0, break, end disp( x ) x = x – 5; end end
Gauss Elimination function [ x ] = GaussNaive( A, b ) % Gauss elimination without pivoting % input: % A = coefficient matrix % b = right hand side vector % output: % x = solution vector [m,n] = size(A); if m~=n, error('Matrix A must be square'); end nb = n+1; Aug = [A b];
Gauss Elimination % forward elimination for k = 1:n-1 for i = k+1:n factor = Aug(i,k)/Aug(k,k); Aug(i,k:nb) = Aug(i,k:nb)-factor*Aug(k,k:nb); end % back substitution x = zeros(n,1); x(n) = Aug(n,nb)/Aug(n,n); for i = n-1:-1:1 x(i) = (Aug(i,nb)-Aug(i,i+1:n)*x(i+1:n))/Aug(i,i);
Gauss Elimination 실행결과 x1 + x2 + 2x3 = 9 2x1 + 4x2 – 3x3 = 1 >> b = [ 9 1 0 ]’; >> GaussNaive(A,b) ans = 1 2 3
Homework Gauss-Jordan Elimination Make a MATLAB program ‘GaussJordan.m’ runs as follows >> A = [ 1 1 2 ; 2 4 -3 ; 3 6 -5 ]; >> b = [ 9 1 0 ]’; >> GaussJordan(A,b) ans = 1 0 0 1 0 1 0 2 0 0 1 3 Refer two samples: GaussNaive.m, GaussianElimination.m Reference for MATLAB syntax: Matlab.pdf