Chapter 2. MATLAB 기초

MATLAB기초 : 서울과학기술대학교 기계시스템디자인공학과 / 김성환교수

2.1 사용환경

(1) 사용 모드

Interactive mode (or Calculator mode) : 프롬프트(>>)마다  한 명령

M-file을 이용하는 방법 : M-파일에는 스크립트 파일과 함수 파일이 있음.

(2) 창의 구성

명령창(Command Window), 명령이력(Command History), 변수창(Work Space)

그래프 창 (Plots)

편집창(Script Editor) : M-file 편집

2.2 배정 (할당; assign)

(1) 형식 : 변수 = 값   (예)  a = 4

디폴트로 echo가 있음. Silent (no echo)로 하려면 세미콜론 (;) 사용

한 줄에서 명령 분리: 세미콜론 (;)  혹은 콤마 (,)

(2) 포맷 (표시하는 방법. 내부 계산의 정밀도는 표시방법과 무관)

(3) 변수

① 변수는 대/소문자를 구분 :  a 와 A는 다르다!!

② 미리 정의된 상수

상수	의미	상수	의미
ans	가장 최근의 답	Inf	무한대
eps	부동 소수점의 정밀도	NaN	정의되지 않은 수치결과
i, j	허수 단위 ([eqn: sqrt {-1}])	pi	원주율([eqn: pi])

③ 스칼라 : 실수. 복소수도 포함. (허수는 i 로 표시. 입력에는 j 도 사용가능)

내부적으로는 1x1의 행렬(matrix)로 처리

>> a=4 ↲  >> A=6; ↲  >> a=4, A=6; x=1; ↲

>> x = 2 + i*4; ↲    >> x = 2 + j*4; ↲

④ 행렬(matrix) : 한 행 혹은 한 열인 행렬은 벡터(vector)라고 부름.

행벡터 : >> a = [1 2 3 4 5] ↲  (>> a = [1, 2, 3, 4, 5] ↲)

열벡터 : >> a = [1; 2; 3; 4; 5] ↲  >> a = [1 2 3 4 5]' ↲

행렬 : >> A = [1 2 3; 4, 5, 6; 7 8 9]

>> A = [[1 4 7]' [2 5 8]' [3 6 9]']

⑤ 변수의 확인

>> who ↲   >> whos ↲

>> b(4) ↲  >> A ↲  >> A(2,3) ↲   □ 첨자(index) 표기법

⑥ 내장 함수를 이용한 변수 초기화

영행렬 : >> E = zeros(n) ↲   >> E = zeros(n,m) ↲

원소1인행렬 : >> u = ones(n) ↲  >> u = ones(n,m) ↲

단위행렬 : >> E = eye(n) ↲  >> E = eye(n,m) ↲

⑦ 콜론 (:) 연산자

증분	디폴트 증분 : >> t = 1:5 ↲ (>> t = [1:5] ↲) 증분 지정 : >> t = 1:0.5:3 ↲ (>> t = [1:0.5:3] ↲) 음의 증분 : >> t = 10:-1:5 ↲ (>> t = [10:-1:5] ↲)
지칭	행 또는 열 전체 지칭 : >> A(2,:) ↲ >> A(:,2) ↲ 구간 선택 : >> s = t(2:4) ↲ (2번 원소 ~ 4번 원소까지)

⑧ linspace( ) 와 logspace( ) 함수

linspace(x1, x2, n) (예) >> linspace(0, 1, 6) ↲

logspace(x1, x2, n) (예) >> logspace(-1, 2, 4) ↲

⑨ 문자열 (외 따옴표 사용)

>> f = 'Miles ' ↲   >> s = 'Davis' ↲

>> x = [f s] ↲

⑩ 다음 줄 연결 : 생략 부호 사용 (...)

⑪ 이전 명령의 사용 : □ 키의 사용

2.3 수학적 연산

(1) 스칼라 산술 연산과 우선 순위

연산자	기호	예	비고
지수	^	>> c = a ^ b ↲
음부호	-	>> a = -b ↲
곱셈, 나눗셈	* /	>> c = a * b ↲
왼쪽나눗셈	＼	>> c = a ＼ b ↲
덧셈, 뺄셈	+ -	>> c = a + b ↲

>> 2 * pi ↲ >> y = pi / 4 ↲ >> y ^ 2.45 ↲	>> y = -4 ^ 2 ↲ >> y = (-4) ^ 2 ↲ (연산자 우선순위!)	>> x = 2 + 4 * i ↲ >> y = 16 ↲ >> 3 * x ↲ >> 1 / x ↲ >> x ^ 2 ↲ >> x + y ↲

(2) 벡터, 배열의 연산

>> a = [1 2 3] ↲ >> b = [4 5 6]' ↲ >> A = [1 2 3; 4 5 6; 7 8 9] ↲ >> dot(a, b) ↲ (내적) >> cross(a, b) ↲ (외적)	>> a * A ↲ >> A * b ↲ >> A * a ↲ (오류!) >> A * A ↲ >> A ^ 2 ↲ (행렬곱) >> A.^ 2 ↲(배열연산, 원소연산) >> A/pi ↲(스칼라 혼합 연산)

(3) 내장함수의 사용

>> help log ↲                  >> help elfun ↲

>> log(A) ↲                    >> log10(A) ↲ (*1)

>> sqrt(A) ↲  (배열방식 연산)  >> sqrtm(A) ↲ (행렬방식 연산) (*2)

(*1) log는 배열방식(원소별) 연산. sqrt, abs, sin, acos, tanh, exp 등도 마찬가지

(*2) 함수명에 m 을 붙여 행렬방식 연산(행렬단위)으로 바꾼 경우

>> E=[-1.6 -1.5 -1.4 1.4 1.5 1.6]     >> ceil(E) ↲    (올림)

>> round(E) ↲       (반올림)         >> floor(E) ↲   (내림)

>> abs(1+2i) ↲                       >> rem(7,3) ↲   (나머지)

(4) 원소의 합, 최대, 최소, 곱, 정렬

>> F = [3 5 4 6 1] ↲

>> sum(F) ↲

>> min(F), max(F), mean(F), prod(F), sort(F) ↲

(5) 자유낙하 속도의 시간에 따른 계산

[eqn: v= sqrt {{gm} over {C _{d}}} tanh LEFT ( sqrt {{gC _{d}} over {m}} t RIGHT )]

>> t = [0:2:20]' ↲

>> length(t) ↲

>> g = 9.81; m = 68.1; cd = 0.25; ↲

>> v = sqrt(g*m/cd)*tanh(sqrt(g*cd/m)*t) ↲

2.5 그래픽

(1) 번지점프 속도 그래프 그리기

>> plot(t, v) ↲

>> title('Plot of v versus t') ↲

>> xlabel('Value of t') ↲

>> ylabel('Value of v') ↲

>> grid

(2) plot 옵션들

>> plot(t, v, 'o') ↲     >> plot(t, v, 'o-') ↲

>> plot(t, v, 's--g') ↲  >> plot(t, v, 'bo:') ↲

>> plot(t,v,'--dc', 'LineWidth', 2, 'MarkerSize', 10, 'MarkerEdgeColor', 'k', 'MarkerFaceColor', 'm') ↲

(2) hold on 옵션

plot 명령어가 실행될 때마다 이전의 그래프 지워짐.

지워지지 않게 하려면 hold on  사용. 다음을 비교할 것

>> plot(t, v) ↲ >> plot(t, v, 'o') ↲	>> plot(t, v) ↲ >> hold on ↲ >> plot(t, v, 'o') ↲ >> hold off ↲

(3) subplot / plot3

subplot(m, n, p) : m×n 으로 나눈 영역 중 p번째 영역에 그린다.

plot3(x, y, z) : x, y, z는 같은 길이의 벡터. 3차원 그래프 그린다.

>> t = 0:pi/50:10*pi ↲

>> subplot(1,2,1) ↲

>> plot(sin(t),cos(t)) ↲

>> axis square ↲(정사각형 유지)

>> title('(a)') ↲

>> subplot(1,2,2) ↲

>> plot3(sin(t),cos(t),t) ↲

복사-붙여넣기 용

t = 0:pi/50:10*pi

subplot(1,2,1)

plot(sin(t),cos(t))

axis square

title('(a)')

subplot(1,2,2)

plot3(sin(t),cos(t),t)

(연습문제 2.15)를 자기 힘으로 해본다.

>> t = linspace(0, 3*pi/2,100) ↲

>> mac = 1 - t.^2/factorial(2) + t.^4/factorial(4) -  t.^6/factorial(6) +  t.^8/factorial(8) ↲

>> plot(t, cos(t)); hold on; plot(t, mac, 'k'); hold off ↲

Chapter 3. MATLAB 프로그래밍

3.1 M-파일

확장자 .m  /  명령창에 입력될 명령어를 순서대로 저장하고 실행
① 스크립트(script) 파일 : 파일에 저장된 명령의 시퀀스(sequence)
② 함수(function) 파일 : 입출력 인수가 있는 M-파일. ‘function’으로 시작

(1) 스크립트 파일 사용 : 번지점프 낙하속도 계산

▪ (File □) New □ Script

▪ 편집창에서 다음을 입력

g = 9.81; m = 68.1; t = 12; cd = 0.25;

v = sqrt(g * m / cd) * tanh(sqrt(g * cd / m) * t)

▪ “scriptdemo.m”으로 저장. 내문서/MATLAB 에 저장됨

▪ 스크립트 실행 : >> scriptdemo ↲

▪ 변수가 유지되는지 확인 : >> g ↲   (유지 됨)

(2) 함수 파일 : M-파일이며 내용이 다음과 같은 형식

function outvar = funcname(arglist) % helpcomments statements outvar = value;	반드시 funcname.m 으로 저장되어야 함

번지점프 속도 구하는 함수 작성

▪ (File □) New □ Script

▪ 편집창에서 다음을 입력

function v = freefall(t, m, cd)

% freefall: bungee velocity with second-order drag

% v=freefall(t,m,cd) computes the free-fall velocity

%                    of an object with second-order drag

% input :

%   t = time (s)

%   m = mass (kg)

%   cd = second-order drag coefficient (kg/m)

% output:

%   v = downward velocity (m/s)

g = 9.81;   % acceleration of gravity

v = sqrt(g * m / cd) * tanh(sqrt(g * cd / m) * t);

▪ “freefall.m”으로 저장. 내문서/MATLAB 에 저장됨

▪ 실행 : >> freefall(12, 68.1, 0.25) ↲

>> freefall(8, 100, 0.25) ↲

▪ 도움말 : >> help freefall ↲

>> lookfor bungee ↲   (시간 오래 걸림 주의 !!)

▪ 변수를 유지하는가? : >> g ↲    : 내부적으로만 사용되고 소멸됨

여러 개의 결과를 반환하는 경우의 예

▪ 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) ↲    (>> stats(y) ↲ 만 하면?

m만 ans에 출력)

부 함수 (sub function)

▪ 함수가 호출하는 함수. (주 함수는 명령 창에서 호출)

function v = freefallsubfunc(t, m, cd)

v = vel(t, m, cd);

end

function v = vel(t, m, cd)

g = 9.81;

v = sqrt(g * m / cd) * tanh(sqrt(g * cd / m) * t);

end

부함수

주함수

▪ 파일 이름은 freefallsubfunc.m 이어야 하며, vel은 명령창에서 호출 불가

3.2 입력-출력

(1) input 함수 : M-파일 실행 중 키보드로부터 값 입력 ( cf: scanf() )

형식 : n = input('promptstring')

(예1) m = input('Mass (kg): ')

(예2) name = input('Enter your name: ', 's')

(2) disp 함수 : M-파일 실행 중 값의 화면 출력

형식 : disp(value)

▪ M-파일 작성

function v = freefalli

% freefalli: interactive bungee velocity

%   freefalli interactive computation of the

%             free-fall velocity of an object

%             with second-order drag.

g = 9.81;     % acceleration of gravity

m = input('Mass (kg): ');

cd = input('Drag coefficient (kg/m): ');

t = input('Time (s): ');

disp(' ')

disp('Velocity (m/s):')

disp(sqrt(g * m / cd) * tanh(sqrt(g * cd / m) * t))

▪ 실행 : >> freefalli ↲

Mass (kg): 68.1

Drag coefficient (kg/m): 0.25

Time (s): 12

Velocity (m/s): 50.6175

(3) fprintf 함수 : disp() 대신 출력을 제어

형식	fprintf('format', x, ...)
예1	>> fprintf('The velocity is %8.4f m/s \n', velocity) The velocity is 50.6175 m/s
예2	>> fprintf('%5d %10.3f %8.5e\n', 100, 2*pi, pi) 100 6.283 3.14159e+00

포맷코드	설명
%d %e %E %f %g	정수포맷 e를 사용하는 과학 포맷 E를 사용하는 과학포맷 소수포맷 %e나 %f 중 간단한 포맷
제어코드	설명
\n \t	새로운 줄로 시작 탭

3.3 구조 프로그래밍 (흐름의 제어)

판정(if, switch)과 루프(반복: for, while)

(1) if 구조 : if ~ end

함수	실행
function grader(grade) if grade >= 60 disp('passing grade:') disp(grade) end	>> grader(95.6) passing grade: 95.6000

(2) error 검사 : error() 함수를 만나면 메시지 후 M-파일이 종료!

함수	실행
function f = errortest(x) if x == 0 error('zero value encountered') end f=1/x;	>> errortest(10) ans = 0.1000 >> errortest(0) Error using errortest (line 3) zero value encountered

(3) 논리 연산자 : 연산의 결과는 T or F 가 됨

예	연산자	관계 (T가될 조건)	C/C++과 비교
x == 0 unit ~= 'm’ a < 0 s > t 3.9 <= a/3 r >= 0	== ~= < > <= >=	같을 때 같지 않을 때 보다 작을 때 보다 클 때 작거나 같을 때 크거나 같을 때	!=

(4) 논리 비교 연산자 : 연산의 결과는 T or F 가 됨

예	연산자	연산	C/C++과 비교
~(x > 0) (a >= 0) & (a <= 100) (a > 0) | (b > 0)	~ & |	Not (논리 부정) And(논리 곱) Or (논리 합)	! && ||

(※) 논리 연산 연습

a=-1, b=2, x=1, y='b' 일때

(*) 논리AND가 논리OR 보다 연산순위 높음 !!

(5) if ~ elseif ~ elseif ~ else ~ end 구조

함수	실행
function sgn = mysign(x) % mysign(x) returns 1 if x is greater than zero. % -1 if x is less than zero. % 0 if x is equal to zero. if x > 0 sgn = 1; elseif x < 0 sgn = -1; else sgn = 0; end	>> mysign(25.6) ans = 1 >> mysign(-0.776) ans = -1 >> mysign(0) ans = 0

(5) 루프 (반복) : for 문

형식	for index = start:step:finish statements end	for index = start:finish statements end
예	for j = 10:-1:1 disp(j) end	for i = 1:5 disp(i) end

factorial 함수 예	실행
function fout = factor(n) % factor(n) : % Computes the product of all the % integers from 1 to n. x = 1; for i=1:n x = x * i; end fout = x; end	>> factor(5) ans = 120

(6) for 루프와 벡터 연산 : 어느쪽이 바람직한가? (벡터연산)

for 루프	벡터 연산
i = 0; for t = 0:0.02:5 i = i + 1; y(i) = cos(t); end	t = 0:0.02:5; y = cos(t);

(7) while 루프

형식	while condition statements end	while (1) statements if condition, break, end statements end (후기점검)
예	x = 8; while x > 0 x = x - 3; disp(x) end	x = 8; while (1) x = x - 3; disp(x) if x < 0, break, end end

(8) pause

형식	pause (아무키나 눌리울 때까 지 대기) pause(n) (n초간 정지) pause(inf) (무한루프. ctrl+c 혹은 ctrl+break 로 탈출)
예	>> for n=3:10, mesh(magic(n)), pause, end >> for n=3:10, mesh(magic(n)), pause(0.5), end

(9) beep, tic / toc

형식	beep (삑 소리) tic / toc (현재시간 저장 / 경과시간 표시)
예	>> tic, beep, pause(5), beep, toc Elapsed time is 5.044251 seconds.

3.4 내포화(Nesting)와 들여쓰기(Indentation)

(1) 내포화 : top-down 방식의 모듈 개발이 프로그램 생산성을 높여줄 수 있다.

(2) 들여쓰기 : for~end, if~end 등의 계층이 생길 때 한 탭씩 들여쓴다.

프로그램의 가독성을 향상시켜 유지보수를 용이하게 한다.

3.5 M-파일로의 함수 전달

함수에 인수(argument)로 전달할 수 있는 것

①	값	변수로 전달
②	함수	무명(anonymous) 함수 혹은 작성된 함수 전달

(1) 무명 함수 (anonymous function) : M-파일 만들지 않고 함수를 정의하는 것

형식	fhandle = @(arglist) expression
예	>> f1 = @(x,y) x^2 + y^2; >> f1 (3, 4) ans = 25	>> a=4; >> b=2; >> f2=@(x) a*x^b; >> f2(3) ans = 36
이전버전	>> f1=inline('x^2 + y^2', 'x', 'y'); (현재버전에서도 동작함)

(2) 함수를 인수로 받는 함수 : fplot(fun, lims)

형식	fplot(fun, lims)
예	>> vel= @(t)sqrt(9.81*68.1/0.25)*tanh(sqrt(9.81*0.25/68.1)*t); >> fplot(vel, [0 12])

(3) 정해진 구간에서 함수의 평균값 구하기

[eqn: v= sqrt {{gm} over {C _{d}}} tanh LEFT ( sqrt {{gC _{d}} over {m}} t RIGHT )], t=0~12에서 함수의 평균값? g=9.81, m=68.1, cd=0.25

▪ 표준 명령어를 이용한 방법

>> t=linspace(0, 12);   (100등분)

>> v = sqrt(9.81*68.1/0.25)*tanh(sqrt(9.81*0.25/68.1)*t);

>> mean(v)

ans = 36.0870

▪ M-파일을 이용한 방법 : 함수를 M-파일 내부에 지정

function favg = funcavg(a, b, n)

% funcavg: average function height

%   favg=funcavg(a,b,n): computes average value

%                        of function over a range

% input:

%   a = lower bound of range

%   b = upper bound of range

%   n = number of intervals

% output:

%   favg = average value of function

x = linspace(a,b,n);

y=func(x);

favg=mean(y);

end

function f = func(t)

부함수

f=sqrt(9.81*68.1/0.25)*tanh(sqrt(9.81*0.25/68.1)*t);

end

>> funcavg(0,12,60)

ans = 36.0127

▪ M-파일을 이용한 방법 : 함수를 M-파일에 인수로 전달

function favg = funcavg(f, a, b, n)

% funcavg: average function height

%   favg=funcavg(f,a,b,n): computes average value

%                          of function over a range

% input:

%   f = function to be evaluated

%   a = lower bound of range

%   b = upper bound of range

%   n = number of intervals

% output:

%   favg = average value of function

x = linspace(a,b,n);

y=f(x);

favg=mean(y);

end

>> vel= @(t)sqrt(9.81*68.1/0.25)*tanh(sqrt(9.81*0.25/68.1)*t);

>> funcavg(vel,0,12,60)

ans = 36.0127

내장함수를 인수로 전달하는 것도 가능함

>> funcavg(@sin,0,2*pi,180)

ans = -6.3001e-17

이상.