Presentation is loading. Please wait.

Presentation is loading. Please wait.

MATLAB 개요와 응용 7장 MATLAB 프로그래밍

Similar presentations


Presentation on theme: "MATLAB 개요와 응용 7장 MATLAB 프로그래밍"— Presentation transcript:

1 MATLAB 개요와 응용 7장 MATLAB 프로그래밍

2 강의 내용 관계 연산자와 논리 연산자 조건문 Switch-case 문 루프(loop) 중첩 루프와 중첩 조건문
break 명령어와 continue 명령어 응용예제 7장 MATLAB 프로그래밍

3 프로그래밍 개요 (1/2) 컴퓨터 프로그램은 원하는 목적을 얻기 위해 작성된 일련의 컴퓨터 명령어들이다. 간단한 프로그램에서는 순차적으로 명령어가 수행되지만, 좀 더 정교한 프로그램에서는 입력된 변수의 값이나 상태에 따라 수행될 명령어가 결정된다. 예) 우체국에서 소포 요금을 계산할 때, 소포의 중량과 크기, 소포의 내용물, 배송방법(특급, 빠른 우편, 보통 등) 등에 따라 다른 계산식을 사용한다. 동일한 과정의 명령어 그룹을 반복해서 수행해야 할 경우도 있다. 예) 방정식을 수치적으로 풀 때, 구하는 답의 오차가 어떤 기준보다 작아질 때까지 일련의 계산과정을 반복적으로 수행해야 한다. MATLAB은 프로그램의 흐름을 제어할 수 있는 여러 도구들을 제공한다. 조건문(conditional statement)과 switch 구조는 상황에 따라 명령어들을 건너뛰거나 특정 그룹의 명령어들을 실행시킬 수 있다. For 루프와 while 루프는 어떤 명령어 그룹을 여러 번 반복 수행시킬 수 있다. 7장 MATLAB 프로그래밍

4 프로그래밍 개요 (2/2) 프로그램의 흐름을 바꾸기 위해서는 프로그램 내에 결정 과정(decision-making process)이 필요하다. 바로 다음 명령을 수행할 것인지, 아니면 하나 또는 그 이상의 명령을 뛰어넘어 다른 명령을 수행할 것인지를 결정해야 한다. 이러한 결정은 관계연산자(relational operator)와 논리연산자(logical operator)를 이용하여 변수들의 값을 비교함으로써 이루어진다. 함수 파일은 부프로그램(subprogram)으로 프로그래밍에 이용될 수 있다. 프로그램 내에서 함수가 포함된 명령줄(command line)을 만나면 프로그램은 함수에 입력을 제공한 후 그 결과를 기다린다. 함수는 계산을 수행한 후 결과를 “함수 호출” 프로그램에 되돌려 주며, 프로그램은 계속해서 그 다음 명령을 수행하게 된다. 7장 MATLAB 프로그래밍

5 알고리즘* 알고리즘(Algorithm) : 한정된 시간 안에 어떤 일을 수행할 수 있도록 잘 정의된 명령어들을 순서에 맞춰 나열한 것으로, 알고리즘은 제어 구조를 이용하여 명령어들의 실행 순서를 변경할 수 있어야 한다. 알고리즘의 운영 방법 : 순차적 실행(Sequential operations) : 순서에 따라 명령을 실행시킴 조건부 실행(Conditional operations) : 참과 거짓을 판단할 수 있는 질문의 결과에 따라 다음에 수행할 명령들을 결정함. 반복 실행(Iterative operations or loops) : 어떤 명령그룹들을 반복해서 실행시킴 7장 MATLAB 프로그래밍

6 구조화 프로그래밍* 구조화 프로그래밍(Structured programming) 구조화 프로그래밍의 장점
프로그램의 기능들을 서로 분리하여 계층적 모듈들을 사용하여 프로그래밍하는 것으로, MATLAB에서는 함수들의 집합체로 프로그램을 작성할 수 있다. 구조화 프로그래밍의 장점 전반적으로 문제를 먼저 검토하고 나서 세부적인 사항을 다룰 수 있으므로 구조화 프로그램은 작성하기가 쉽다. 한 개의 응용문제를 위해 작성한 모듈들(함수들)을 다른 응용문제에도 사용할 수 있다. (이것을 reusable code라고 한다) 각 모듈은 단 하나의 목적을 수행하도록 설계되었으며 따라서 다른 모듈과 분리하여 테스트할 수 있으므로, 구조화 프로그램은 디버깅하기가 쉽다. 구조화 프로그래밍은 여러 사람들이 각자 모듈을 개발할 수 있으므로 공통 프로그램에 대해 팀을 이뤄 작업할 때 효과적이다. 모듈에 의미있는 이름을 부여하고 모듈의 목적을 명확히 알 수 있도록 설명을 붙인다면, 구조화 프로그램은 이해하고 수정하기가 쉽다. 7장 MATLAB 프로그래밍

7 흐름도(Flowchart)* 프로그램의 흐름을 실제 프로그래밍 언어를 사용하지 않고 그림과 간단한 글이나 식으로 표시하는 것으로 긴 프로그램을 작성할 때 도움이 된다. 연산 시작 논리 표현 연산 1 종료 연산 2 7장 MATLAB 프로그래밍

8 관계연산자(Relational operator) (1/5)
관계연산자는 두 수를 비교하여 결과가 참인지 거짓인지를 결정한다. 결과가 참이면 1을, 거짓이면 0의 값을 준다. 관계 연산자 설명 < a < b >> 5 > 8 의 결과는 0 > a > b >> 5 > 3 의 결과는 1 <= a ≤ b >> 5 <= 8 의 결과는 0 >= a ≥ b >> 5 >= 8 의 결과는 1 == 같다 >> 4 == 4 의 결과는 1 ~= 같지 않다 ( C의 != ) >> 5 ~= 4 의 결과는 1 관계연산자는 수학식 안에서 산술 연산자처럼 사용될 수 있으며, 결과는 배열의 주소 지정에 사용되거나 MATLAB의 다른 명령어들과 함께 사용되어 프로그램의 흐름을 제어할 수 있다. 7장 MATLAB 프로그래밍

9 관계연산자 (2/5) 크기가 같은 두 배열을 비교하면, 원소 대 원소 별로 비교하여 각 원소의 비교 결과에 따라 0과 1을 갖는 같은 크기의 논리배열(logical arry)을 출력한다. 스칼라를 배열과 비교하면, 스칼라는 배열의 모든 요소와 비교되어 비교 결과에 따라 0과 1을 갖는 논리배열을 출력한다. >> bool = 4 < % 4가 10보다 작으므로 1을 bool에 할당한다. bool = 1 >> (3 > 2) + (9 < 5) + (12/2==3*2) % 1+0+1=2 ans = 2 >> x=randperm(5), y=randperm(5) x = y = >> z = x >= y % z = (x >= y)와 같다 z = >> a = x == y % a=(x==y), 원소별로 x 와 y의 값이 같으면 참이다. a = >> b = x ~= y % 원소별로 x 와 y의 값이 같지 않으면 참이다. a = 7장 MATLAB 프로그래밍

10 관계연산자 (3/5) >> x=randperm(5), y=randperm(5) x = 5 3 4 2 1
관계연산자 (3/5) >> x=randperm(5), y=randperm(5) x = y = >> z = x – y > % 산술연산을 먼저 한 후 각 원소를 0과 비교 x = >> z = x >= y % z = (x >= y)와 같다 z = >> z=x(x<y) z = >> X = [ ; ; ]; >> B = X >= 4 B = 7장 MATLAB 프로그래밍

11 관계연산자 (4/5) >> A=[ 2 7 6; 4 -2 5]; B = [2 8 0.5; 6 -1 5];
관계연산자 (4/5) >> A=[ ; ]; B = [ ; ]; >> C1 = A > B C1 = >> C2 = A <= B C2 = >> C3 = A == B C3 = >> C4 = A ~= B C4 = >> C5 = A – ( B > 4 ) C5 = 7장 MATLAB 프로그래밍

12 관계연산자 (5/5) 관계연산의 결과로 얻어진 논리벡터를 다른 벡터 v의 주소 지정에 사용하면, 논리벡터의 원소가 1인 위치에 해당하는 벡터 v의 원소만 추출해 준다. >> v = [ ]; >> bool = v <= 8 % 벡터 v의 원소들이 8이하인지 비교한다. bool = >> w = v(bool) % 논리벡터를 이용한 벡터 v의 원소 추출 w = >> w = v( v <=8 ) >> n = [ ]; >> v(n) ??? Subscript indices must either be real positive integers or logicals >> v( [ ] ) % 일반적인 배열의 주소 지정 ans = n은 논리벡터가 아니므로 주소 지정에 사용될 수 없다. 7장 MATLAB 프로그래밍

13 관계연산자의 응용 (1/2) 논리벡터가 산술연산에 사용되면, 논리벡터는 먼저 수치벡터로 변환된다.
관계연산자의 응용 (1/2) 논리벡터가 산술연산에 사용되면, 논리벡터는 먼저 수치벡터로 변환된다. 산술연산자(+, -, *, /, \ )는 관계연산자보다 연산 순위가 우선이다. 예) z= 5 > vs. z = 5 > (2 + 7) 분모가 0이 되어 계산을 못 하게 되는 에러를 막기 위한 기법으로 관계연산자를 이용할 수 있다*. >> 3+4<16/2 % 더하기와 나누기가 먼저 실행되므로 “7 < 8”의 결과는 1임 ans = 1 >> A = [ ; ]; >> A = A + (A==0)*eps; % A의 원소중에 0이 있으면, 0 대신 eps로 대체함 >> format long e, A A = e e e-016 e e e+000 >> eps % eps : floating point relative accuracy(ε ) ans = e-016 7장 MATLAB 프로그래밍

14 관계연산자의 응용* (2/2) sinc 함수 의 그래프 그리기 “Divide by zero” 의 수정
관계연산자의 응용* (2/2) “Divide by zero” 의 수정 >> x = -10 : 10 ; % 벡터 x에 0이 포함됨 >> y = sin(x) ./x ; grid on Warning: Divide by zero. y = Columns 1 through 8 …… Columns 17 through 21 >> plot(x, y) >> x = -10 : 10; >> x = x + (x==0)*eps ; >> y = sin(x) ./x >> plot(x, y); grid on sinc 함수 의 그래프 그리기 7장 MATLAB 프로그래밍

15 논리연산자(Logical operator) (1/4)
MATLAB의 논리 연산자 논리연산자 이름 & AND >> A & B % 둘 다 1(true)일 때만 결과가 1(true)임 | OR >> A | B % 최소한 둘 중 하나라도 1이면 결과가 1임 ~ NOT >> ~A % A의 반대를 돌려줌. 즉 1이면 0을 줌 && Short-Circuit (단축) AND >> A && B % 둘 다 1일 때만 결과가 1임. 따라서 A가 0 이면 B를 계산하지 않고 결과로 0을 돌려줌 || Short-Circuit (단축) OR >> A || B % 둘 중 하나라도 1이면, 결과가 1임. 따라서 A가 1이면 B와 상관없이 결과로 1을 돌려줌 xor(x, y) Exclusive OR >> xor(A, B) % A, B 둘 중 하나만 1일 때 1을 돌려줌 논리연산자는 숫자에 대해 작용하며, 0이 아닌 숫자는 모두 참(true)으로 보며, 0은 거짓(false)이다. 7장 MATLAB 프로그래밍

16 논리연산자 (2/4) MATLAB의 논리 연산자 X Y not(X) or(X, Y) xor(X, Y) and(X, Y) ~X
논리연산자 (2/4) MATLAB의 논리 연산자 X Y not(X) or(X, Y) xor(X, Y) and(X, Y) ~X X|Y - X & Y 1 >> bool = 2 & -1 bool = 1 >> bool = 1 | 0 >> ~5 ans = 0 >> x=[ ]; y=[ ]; >> x | y ans = >> xor( x, y) ans = >> x & y ans = % 0<x<7의 MATLAB 표현 >> 0 < x & x < 8 ans = >> (0 < x) & (x < 8) 7장 MATLAB 프로그래밍

17 논리연산자 (3/4) 논리연산자는 수학식 안에서 산술 연산자처럼 사용될 수 있으며, 결과는 다른 수학식이나 배열의 주소 지정에 사용될 수 있고 MATLAB의 다른 명령어(예를 들어 if)와 함께 사용되어 프로그램의 흐름을 제어할 수 있다. 논리연산자는 스칼라와 배열에 사용될 수 있으며 서로 섞어 쓸 수 있다. 논리연산자는 산술연산자(+, -, *, /, \ )와 관계연산자보다 우선 순위가 늦다. 단, NOT(~) 연산자는 괄호와 거듭제곱(^) 다음으로 우선 순위가 높음. 연산자의 우선 순위 1순위 : 괄호(괄호가 중첩되어 있는 경우, 가장 안쪽 괄호가 최우선 순위) 2순위 : 거듭제곱(^) 3순위 : Logical NOT(~) 4순위 : 곱하기, 나누기 5순위 : 더하기, 빼기 6순위 : 관계연산자( >, <, >=, <=, ==, ~= ) 7순위 : 논리연산자 AND(&) 8순위 : 논리연산자 OR( | ) 같은 우선순위를 가진 연산자가 둘 이상 있는 경우, 왼쪽에서 오른쪽 순서로 연산을 수행한다. 7장 MATLAB 프로그래밍

18 논리연산자 (4/4) MATLAB버전 6 이전에는 우선순위에 변동이 있으므로 괄호를 사용하는 것이 안전하다.
논리연산자 (4/4) x==3의 결과가 0이므로 (y <4)와 상관없이 답이 0이므로 (y<4)는 실행되지 않는다. x==2의 결과가 1이므로 y > 4와 상관없이 결과가 1이므로 y > 4는 실행되지 않는다. MATLAB버전 6 이전에는 우선순위에 변동이 있으므로 괄호를 사용하는 것이 안전하다. >> x = -2; y = 5; >> 5 < x & x < -1 ans = 0 >> -5 < x & x < % -5 < x → 1, x<-1 → 1 이므로 1 & 1 → 1이다. ans = 1 >> ~(y < 7) % y < 7 → 1이므로 ~1 → 0 >> ~y < % ~y → 0이므로 0 <7 → 1 >> ~( (y>=8) | (x <-1) ) % y>=8 →0, x<-1 → 1이므로 ~(0|1) →0 >> x=2; y=3; x==3 && y < 4 >> x==2 || y > 4 7장 MATLAB 프로그래밍

19 내장 논리함수 (1/4) and(A, B) ↔ A & B or(A, B) ↔ A | B not(A) ↔ ~A
내장 논리함수 (1/4) and(A, B) ↔ A & B or(A, B) ↔ A | B not(A) ↔ ~A xor(A, B) : A와 B 둘 중 하나만 1일 때 1이다. >> xor(7, 0) ans = 1 >> xor(7, -5) ans = 0 any(A), any(A, dim) : A가 벡터인 경우 A의 원소중 한 개라도 0이 아니면 1을, 모두 0이면 0을 돌려준다. 즉, A의 원소중에 0이 아닌 원소가 한 개라도 있는 지 검사하는 함수이다. A가 행렬인 경우 A의 각 열(column)을 벡터로 취급하여 각 벡터의 원소중 한 개라도 0이 아니면 1을 돌려준다. >> A = [ ; ; ]; >> any(A) ans = 7장 MATLAB 프로그래밍

20 내장 논리함수 (2/4) ischar(A) : A가 글자 배열이면 논리 1을, 아니면 논리 0을 돌려준다.
내장 논리함수 (2/4) ischar(A) : A가 글자 배열이면 논리 1을, 아니면 논리 0을 돌려준다. >> x=[1:3]; s='character array‘; >> ischar(x) ans = 0 >> ischar(s) ans = 1 isempty(A) : A가 빈 행렬이면 1을, 아니면 0을 돌려준다. >> A=[]; >> isempty(A) >> A(1,1)=5; A(2,2)=3 A = 7장 MATLAB 프로그래밍

21 내장 논리함수 (3/4) isinf(A) : A의 원소가 무한대이면 해당 원소 자리에 1을, 아니면 0을 가진, A와 같은 크기의 배열을 돌려준다. >> x = [ ]; >> isinf(1./x) ans = isnan(A) : A의 원소가 ‘NaN’이면 해당 원소 자리에 1을, 아니면 0을 가진, A와 같은 크기의 행렬을 돌려준다. >> isnan(0./x) logical(A) : 숫자배열 A를 논리배열로 바꾼다 >> x=[ ]; bool=[ ]; >> x(bool) ??? Subscript indices must either be real positive integers or logicals. >> k=local(bool); x(k) x= 7장 MATLAB 프로그래밍

22 내장 논리함수 (4/4) islogical(A) : A가 논리배열이면 1을, 아니면 0을 돌려준다.
내장 논리함수 (4/4) islogical(A) : A가 논리배열이면 1을, 아니면 0을 돌려준다. >> x=[ ]; y=[ ]; >> bool = x > y bool = >> islogical(bool) ans = 1 >> z = [ ]; islogical(z) ans = 0 isnumeric(A) : A가 숫자배열이면 1을, 아니면 0을 돌려준다. >> isnumeric(bool) >> isnumeric(z) 7장 MATLAB 프로그래밍

23 내장 논리함수 find (1/2) find 명령어는 주어진 논리가 참(true)이 되게 하는 벡터나 배열의 원소 주소를 돌려준다. 입력인자는 벡터, 배열, 또는 논리 표현식이다. find(A) 벡터나 배열인 A에서 0이 아닌 원소의 주소를 돌려준다. k=find(A) 벡터나 배열인 A를 하나의 열(column)벡터로 생각하여 0이 아닌 원소의 주소를 돌려준다. [i, j, v]=find(A) 배열 A에서 0이 아닌 원소의 주소 (i, j)와 해당 값을 벡터 v로 돌려준다. >> x=[ ]; y = [ ]; A=[x; y]; >> find(x) ans = >> find(x & y) ans = 3 >> [m, n, v] = find(A) m = n = v = 1 A(1,1) → 1 A(1,3) → -2 A(2,3) → 0 공간 제약으로 실제와 다르게 이렇게 표현함 7장 MATLAB 프로그래밍

24 내장 논리함수 find (2/2) find(논리표현식) 논리 표현식이 참(true)을 만족하게 하는 배열의 원소
주소를 돌려준다. >> A=[ ; ; ]; >> [m, n, v] = find(A > 3) m = 1 3 n = v = >> find(0<A & A < 9) ans = 5 7장 MATLAB 프로그래밍

25 예제 온도 데이터의 분석 (1/2) 대전의 7월 중순의 낮 최고 기온이 다음 표와 같다. 다음을 구하라.
예제 온도 데이터의 분석 (1/2) 대전의 7월 중순의 낮 최고 기온이 다음 표와 같다. 다음을 구하라. 1) 낮 최고기온이 30° 이상인 날은 모두 며칠인가? 2) 낮 최고기온이 25°~28°에 해당하는 날은 모두 며칠인가? 3) 낮 최고기온이 28°~32°에 해당하는 날짜는 언제입니까? 날짜 11 12 13 14 15 16 17 18 19 20 21 기온 24 25 28 30 32 29 26 23 33 31 >> T=[ ]; >> T30 = T >= 30; ans = >> T30Days = sum(T30) T30No = 4 >> T25to28 = 25 <= T & T <= 28 T25to28 = >> T25to28Days = sum(T25to28) ans = 3 7장 MATLAB 프로그래밍

26 예제 (2/2) 3) 낮 최고기온이 28°~32°에 해당하는 날짜는 언제입니까?
예제 (2/2) 3) 낮 최고기온이 28°~32°에 해당하는 날짜는 언제입니까? 날짜 11 12 13 14 15 16 17 18 19 20 21 기온 24 25 28 30 32 29 26 23 33 31 >> T28to32 = find( 28 <= T & T <= 32) + 10 ans = 7장 MATLAB 프로그래밍

27 조건문(Conditional statements)
조건문은 MATLAB이 조건문 다음에 오는 명령어 그룹을 실행시킬 지에 대한 결정을 하도록 하는 명령어이다. 조건문에는 조건식이 기술된다. 이 조건식이 참이면 조건문 다음의 명령어 그룹들이 실행되며, 거짓이면 명령어 그룹들을 실행하지 않고 건너뛰게 된다. if – end 구조 ………… if 조건식 …… end MATLAB 명령어 그룹 MATLAB 프로그램 명령어 명령어 그룹 거짓 if 문 7장 MATLAB 프로그래밍

28 if 문 사용 예 (1/2) if 조건문 사용 예 : if x < 10^-5 if n == 10 if x ~= 0
if x >=0, y = sqrt(x), end 와 같이 한 줄로 쓸 수도 있다. if x>=0 & y>= 0, z=sqrt(x)+y, w=log(x)–log(y), end 와 같이 한 줄로 쓸 수도 있다. if 조건문 사용 예 : if x < 10^-5 if n == 10 if x ~= 0 if (n > 10) & ( x > 100) x ≥ 0일 때 √x 를 계산하라. if x >=0 y = sqrt(x) end x ≥ 0, y ≥ 0일 때 z=√x + √y 와 w=log x – log y를 계산하라. if x >=0 & y >= 0 z = sqrt(x) + y w= log(x) – log(y) 7장 MATLAB 프로그래밍

29 if 문 사용 예 (2/2) 사용자가 입력한 숫자의 홀, 짝수를 판정하는 프로그램 벡터의 평균값을 구하는 프로그램
n = input(‘홀수, 짝수를 판별할 숫자를 입력하시오 : ’); if rem(n, 2) == 0 fprintf( ‘%d는(은) 짝수입니다.\n’, n); end if rem(n, 2) ~= 0 fprintf( ‘%d는(은) 홀수입니다.\n’, n); 벡터의 평균값을 구하는 프로그램 >> ave 데이터를 입력하시오 : [1:10] 평균값은 5.50입니다. 데이터를 입력하시오 : ??? Error using ==> ave 데이터가 입력되지 않았습니다. x = input( '데이터를 입력하시오 : '); n=length(x); if (~n) error( '데이터가 입력되지 않았습니다.') avg = sum(x)/n; fprintf( '평균값은 %.2f입니다.\n', avg) 7장 MATLAB 프로그래밍

30 예제 7.2 노동자의 급료 계산 어떤 노동자가 기준 노동시간인 40시간까지는 자신의 시간당 임금에 따라 급료를 받으며, 초과시간에 대해서는 50%를 더 받는다. 이 노동자의 급료를 계산하는 프로그램을 스크립트 파일로 작성하라. 프로그램 실행시 사용자는 근로시간과 시간당 임금을 입력하게 되며, 프로그램은 급료를 출력한다. >> Workerpay 근무한 시간 수를 입력하시오: 35 시간당 임금을 달러로 입력하시오: 8 노동자의 임금은 $280.00입니다. t=input('근무한 시간 수를 입력하시오: '); h=input('시간당 임금을 달러로 입력하시오: '); Pay=t*h; if t>40 Pay=Pay+(t-40)*0.5*h; end fprintf('노동자의 임금은 $%5.2f입니다.\n', Pay) 파일명 : workerpay 7장 MATLAB 프로그래밍

31 if – else – end 구조 조건판단에 따라 실행해야 할 선택사항이 서로 상반된 두 가지일 경우 if-else-end 구조를 사용한다. 예를 들어 어떤 수의 짝수, 홀수 여부에 따라 다른 명령을 수행해야 할 경우, 짝수에 따른 명령과 홀수에 따른 명령은 서로 독립적이므로 두 가지 조건문이 필요하게 된다. ………… if 조건 식 …… else end MATLAB 명령어 그룹 1 MATLAB 프로그램 명령어 명령 그룹 1 거짓 if 문 명령 그룹 2 그룹 2 7장 MATLAB 프로그래밍

32 if – else – end 사용 예 사용자가 입력한 숫자의 홀, 짝수를 판정하는 프로그램
2 kg 이하 소포의 등기배달 요금은 4,000원, 보통배달 요금은 2,700원이다. 배달 종류에 따라 소포 세 개의 요금을 계산하는 프로그램을 작성하라. n = input('홀수, 짝수를 판별할 숫자를 입력하시오 : '); if rem(n, 2) == 0 fprintf('%d는(은) 짝수입니다.\n', n); else fprintf('%d는(은) 홀수입니다.\n', n); end n = input('소포의 개수를 입력하시오 : '); type = input('소포의 배달 종류를 선택하시오(등기=1, 보통=0) :'); if type charge=4000*n; charge=2700*n; fprintf('총 배달 요금은 %d입니다.\n', charge); 7장 MATLAB 프로그래밍

33 예제 7.3 급수탑의 물 높이 급수탑 탱크는 원통인 밑부분과 원뿔대 모양의 윗부분으로 이루어져 있다. 탱크 안 부표(float)의 위치 h로부터 탱크 안 물의 체적을 구하는 사용자정의 함수를 작성하라. 입력은 h의 값(m)이고, 출력은 물의 체적(m3)이다. 탱크 안 물의 체적 0≤h≤19 m일 때 : V =(12.52)h 19<h≤33 m일 때 : function v = watervol(h) % watervol은 급수탑의 물의 체적을 계산한다. % 입력: 물의 높이(m), 출력: 물의 체적(m^3). if h<=19 v=pi*12.5^2*h; else rh= *(h-19)/14; v=pi*12.5^2*19+pi*(h-19)*(12.5^2+12.5*rh+rh^2)/3; end >> watervol(8) ans = 3.9270e+003 >> watervol(25.7) 1.4115e+004 >> 7장 MATLAB 프로그래밍

34 if – elseif – else - end 구조
명령어 명령 그룹 1 거짓 if 문 명령 그룹 2 elseif 문 명령 그룹 3 ………… if 조건식 …… elseif 조건식 else end MATLAB 명령어 그룹 1 MATLAB 프로그램 그룹 2 그룹 3 7장 MATLAB 프로그래밍

35 if - elseif - else - end 사용 예
2차방정식 ax2+bx+c=0의 근을 구하는 함수 프로그램을 작성하고, 3x2–9x+4 =0과 5x2–14x+13=0의 해를 각각 구하라. roots(C) : 다항식 anxn+an-1xn-1+…+a1x+a0=0의 계수 C=[an an-1 … a1 a0]를 입력인자로 받아 해를 계산하여 벡터로 돌려준다. >> root2(3, -9, 4) ans = >> root2(5, -14, 13) i i >> roots([5, -14, 13]) % 내장함수 이용 i i >> function x = root2(a, b, c) % root2는 2차 방정식의 근을 구한다. D = b^2 – 4*a*c; tmp1 = -b/(2*a); if ~D % 또는 D == 0 x = tmp1; elseif D > 0 tmp2 = sqrt(D)/(2*a); x(1)=tmp1+tmp2; x(2)=tmp1–tmp2; else tmp2 = sqrt(-1*D)/(2*a); x(1)=tmp1+tmp2*i; x(2)=tmp1-tmp2*i; end 7장 MATLAB 프로그래밍

36 문자열과 조건문 예를 들어 ‘Yes’나 ‘No’와 같은 사용자의 문자열 입력에 따라 프로그램의 흐름을 제어하고자 하는 경우 , 조건문에서 문자열과의 비교가 필요하다. 소포 요금 계산 프로그램 예제 n = input('소포의 개수를 입력하시오 : '); type = input('등기소포입니까? Y/N[Y] :', 's'); if ( isempty(type)) | (type =='Y') | (type == 'y') type = 'Y'; else type = 'N'; end str = '등기'; unit=4000; if type =='N' str = '보통'; unit=2700; charge = unit*n; fprintf('%s소포 요금은 총 %d원(%d원%d개)입니다.\n', str, charge, unit, n) 비교) if type ==‘Y’ str = '등기'; unit=4000; str = '보통'; unit=2700; 7장 MATLAB 프로그래밍

37 if - elseif - else - end 사용 예
소포 요금표를 이용하여 소포의 요금을 계산하는 프로그램을 작성하라. if isempty(n), error('소포 개수를 입력하세요.'), end m= input('소포의 무게를 입력하시오(kg) : '); type = input('등기소포입니까? Y/N[Y] :', 's'); if ( isempty(type) | (type =='Y') | (type == 'y') ) str = '등기'; if m > 5, unit = 5500; elseif m > 2, unit = 4500; else unit = 4000; end else str = '보통'; if m > 5, unit = 4200; elseif m > 2, unit = 3200; else unit = 2700; fprintf('\n소포 %d개의 %s 소포요금은 %d개x%d원=%d원입니다.\n\n', … n, str, n, unit, n*unit) 구분 ~2 kg ~5 kg 5 kg 이상 등기 4,000 4,500 5,500 보통 2,700 3,200 4,200 7장 MATLAB 프로그래밍

38 switch-case 문 switch – case문은 switch 다음의 표현식의 값에 따라 여러 명령그룹들중에서 한 그룹을 골라 실행시킬 때 사용한다. switch문-case문은 if문을 사용하여 똑같이 실행시킬 수 있지만, switch문이 프로그램을 이해하기가 더 쉽다. switch문의 구조 ………… switch 표현식 case 값1 …… case 값2 otherwise end MATLAB 명령어 그룹 1 MATLAB 프로그램 그룹 2 그룹 n 명령어 명령 그룹 1 그 외 값1 switch 문 명령 그룹 2 명령 그룹 n 값2 7장 MATLAB 프로그래밍

39 switch-case문의 사용 방법 다음 예제를 통해 switch-case문의 사용방법에 대해 알아보자.
route = input('원하는 노선을 선택하세요 : '); switch route case 1 fare = 1000; case 2 fare = 1100; case {3, 4, 5} fare = 1200; fare = 1300; otherwise disp( [int2str(route), '번은 없는 노선입니다.'] ) fare = 0; end if fare fprintf('%d번 노선 요금은 %d원입니다.\n', route, fare) switch 다음의 표현식은 스칼라나 문자열, 값이 미리 정의된 변수나 정수 결과를 갖는 수학식이 될 수 있다. route값이 2이면 case 2에 해당하는 명령어 그룹이 실행된다. 만일 case 2가 한 개 이상인 경우에는 처음 만나는 case문만 실행된다. case 문은 2개 이상의 값을 가질 수 있으며, 이 경우 벡터 표시와 달리 ‘{ }’ 표시를 사용한다. 7장 MATLAB 프로그래밍

40 switch-case문의 사용 예 주어진 단위의 길이를 cm 단위로 변환하는 프로그램을 작성해보자.
unit = input('변환할 현재 단위는[in/ft/m/cm] ? : ', 's'); x= input('현재 길이는? : '); switch unit case {'in', 'inch'} lcm = x * 2.54; case {'ft', 'feet'} lcm = x * 2.54*12; case {'m', 'meter'} lcm = x * 100; case {'cm', 'centimeter'} lcm = x; otherwise disp( ['unknown unit : ', unit] ) lcm = NaN; end fprintf('%d %s는 %d cm입니다.\n', x, unit, lcm) 7장 MATLAB 프로그래밍

41 예제 7.4 에너지의 단위 변환 (1/2) Joule, ft-lb, cal, eV 단위의 에너지를 다른 단위로 변환하는 스크립트 파일을 작성하라. 실행시에 에너지의 양과 현재 단위, 원하는 단위를 입력해야 하며, 변환된 에너지 양을 출력한다. 1 J=0.738 ft-lb=0.239 cal =6.24×1018 eV이다. 또한 프로그램으로 다음을 변환하라. a) 150 J을 ft-lb로, b) 2800 cal를 Joule로, c) 2.7 eV를 cal로. Ein=input('변환할 에너지(일)의 값을 입력하시오: '); EinUnits=input('현재 단위를 입력하시오(J, ft-lb, cal, or eV): ', 's'); EoutUnits=input('새 단위를 입력하시오(J, ft-lb, cal, or eV): ', 's'); error=0; switch EinUnits case 'J' EJ=Ein; case 'ft-lb' EJ=Ein/0.738; case 'cal' EJ=Ein/0.239; case 'eV' EJ=Ein/6.24e18; otherwise error=1; end 파일명 : EnergyConversion 7장 MATLAB 프로그래밍

42 예제 7.4 (2/2) switch EoutUnits case 'J' Eout=EJ; case 'ft-lb'
예제 (2/2) switch EoutUnits case 'J' Eout=EJ; case 'ft-lb' Eout=EJ*0.738; case 'cal' Eout=EJ*0.239; case 'eV' Eout=EJ*6.24e18; otherwise error=1; end if error disp('ERROR current or new units are typed incorrectly.') else fprintf('E = %g %s',Eout,EoutUnits) >> >> EnergyConversion 변환할 에너지(일)의 값을 입력하시오: 2800 현재 단위를 입력하시오(J, ft-lb, cal, or eV): cal 새 단위를 입력하시오(J, ft-lb, cal, or eV): J E = J 명령창에서의 실행결과 7장 MATLAB 프로그래밍

43 Loop : for-end loop (1/2) 루프는 명령어 그룹을 어떤 횟수만큼 반복 수행하며, 매회 반복시 적어도 1개 이상의 변수가 루프 내에서 새 값을 할당받는다. 루프에는 반복횟수가 지정된 for-end loop와 지정 조건이 만족될 때까지 반복되는 while-end loop가 있다. for-end loop for k = f : s : t 명령어 그룹 end 명령어 명령 그룹 거짓 k ≤ 최종값 k 값 수정 명령 그룹 n Loop의 인덱스 변수 k는 아무 변수 이름이나 상관없지만, 주로 i, j, k, m, n 등이 사용된다. MATLAB에서는 i, j가 복소수 표현에 사용되므로 복소수를 사용할 때는 사용하지 않도록 한다. 처음 실행할 때 k=f이며 명령어 그룹을 실행한 후 두 번째 실행에서는 k=f+s이 된다. k가 최종값 t를 초과하게 되면 명령어 그룹을 실행하지 않고 end 다음의 명령어로 넘어간다. 예) k=1:2:4일 때 루프는 k=1, 3에 대해 2번 실행된다. 7장 MATLAB 프로그래밍

44 Loop : for-end loop (2/2) for k = f : s : t 명령어 그룹 end
증감값 s가 1과 같으면, 생략해도 된다. 예) for m=1:4 ↔ for m=1:1:4 증감값 s는 음수가 될 수 있다. 예) k=8:-3:1은 k=8, 5, 3으로 세 번 반복하게 된다. 시작값인 vi가 최종값인 vf와 같으면, 단 한번만 실행하게 된다. f > t와 s > 0, 또는 f < t와 s < 0이면 루프는 실행되지 않으며, f=t이면 1번 실행된다. 루프 인덱스 k는 f 부터 시작해서 루프를 돌 때마다 s씩 증가하며, 그 때마다 최종값 t 보다 큰 지 검사해서 k가 t보다 크면 루프를 종료한다. 마지막으로 실행할 때의 k 값은 t와 같거나 t보다 작다. for 문에서 k 값에 벡터로 지정된 특정 값을 할당할 수도 있다. 예) for k=[ ], disp(k), end k 값이 루프 내에서 다시 정의되어서는 안 된다. 루프가 끝나면, 루프 인덱스 변수 k의 값은 마지막으로 할당받은 값이다. for 문에서 최종값과 비교할 때의 값이 아니라는 점에 주의하라. 7장 MATLAB 프로그래밍

45 for-end 루프의 사용 예 1 1, 4, 7, 10의 네 수의 제곱값을 차례대로 구하여 출력하라.
>> for k=1:3:10, x=k^2, end x = 1 16 49 100 for k=1: 3: 10 x = k^2 end 7장 MATLAB 프로그래밍

46 for-end 루프의 사용 예 2 1부터 사용자가 입력한 N 까지의 모든 홀수들의 합과 곱을 구하는 프로그램을 작성하라.
예를 들어 N=6인 경우, i 는 1부터 2씩 증가하므로 세 번 루프를 돌며, i는 각 루프에서 1, 3, 5의 값을 갖는다. i=7은 최종값 6을 초과하므로 i=5가 최종값이 된다. N=input('최종 숫자를 입력하시오 : '); sum = 0; product = 1; for i=1: 2: N sum = sum + i; product = product * i; end fprintf('1부터 %d까지의 모든 홀수들의 합은 %d 이다.\n', N, sum) fprintf('1부터 %d까지의 모든 홀수들의 곱은 %d 이다.\n', N, product) fprintf('마지막으로 더해진 홀수는 %d 이다.\n', i) 7장 MATLAB 프로그래밍

47 for-end 루프의 사용 예 3 사용자가 입력한 수 N의 계승(factorial)을 계산하는 프로그램을 작성하라.
5! = 120 N=input('계승(factorial)을 구할 수를 입력하시오 : '); if (N >=0 ) f = 1; for i=1:N f = f*i; end fprintf('%d! = %d\n', N, f); else fprintf('음수 %d을(를) 입력했습니다. 양수를 입력하세요.\n', N) 7장 MATLAB 프로그래밍

48 for-end 루프 사용 예 4 for-end 루프를 사용한 결과와 원소별 연산을 사용한 결과가 같은 경우가 있는데, 일반적으로 원소별 연산이 루프보다 더 빠르며 두 방법 모두 사용 가능한 경우라면 원소별 원소 연산방법이 더 바람직하다. 예제 for x=1:2:9 y = sqrt(x); end for x=[ ] y = sqrt(x); end for 명령어에서 인덱스에 배열이 주어진 경우, 열벡터의 원소가 모두 수행될 때까지 열벡터가 순서대로 인덱스 변수에 대입되어 루프를 반복한다. for n=A fprintf('n=%d, ', n) x=(n(3)-n(2))*n(1); fprintf('x=%d\n', x) n=2, n=8, n=9, x=2 n=4, n=5, n=8, x=12 n=6, n=7, n=11, x=24 명령창에서의 실행결과 x=[ ] y = sqrt(x) vs. 7장 MATLAB 프로그래밍

49 for-end 루프 사용 예 5 for 명령어의 루프 인덱스 변수에 실수도 사용될 수 있다.
벡터 v의 원소 중에서 양의 원소의 주소를 알려 주는 프로그램 v=[ ]; n=0; for m=1:length(v) if v(m)>0 n=n+1; y(n)=m end loop No =1, i= 2.1 loop No =2, i= 4.3 loop No =3, i= 7.5 loop No =4, i=-6.8 실행결과 >> find_for y= >> find(x>0) ans= loop=1; for i=[ ] fprintf('loop No =%d, i=%4.1f\n', loop, i) loop=loop+1; 7장 MATLAB 프로그래밍

50 예제 7.5 급수의 합 (1/2) (a) 루프를 반복할 때마다 급수의 각 항을 계산하고 이전 항들의 합에 더한다. 실행결과
예제 7.5 급수의 합 (1/2) (a) 루프를 반복할 때마다 급수의 각 항을 계산하고 이전 항들의 합에 더한다. n=input('항의 개수를 입력하시오: '); s=0; for k=1:n s=s+(-1)^k*k/2^k; end fprintf('급수의 합은 %f 이다.\n', s) >> Exp7_4a 항의 개수를 입력하시오: 4 급수의 합은 이다. 항의 개수를 입력하시오: 20 급수의 합은 이다. 실행결과 a) for-end 루프를 이용하여 급수의 첫 n항의 합 을 계산하는 프로그램을 작성하고, n=4와 n=20에 대해 합을 구하라. b) Taylor 급수를 이용하여 sin(x)를 계산하는 사용자정의 함수 파일을 작성하라. 함수 이름과 인자는 y=Tsin(x,n)으로 한다. 입력인자는 각도(°)인 x와 급수의 항의 개수인 n이다. 이 함수로 항의 개수가 3과 7일 때 sin(150°)를 계산하라. 7장 MATLAB 프로그래밍

51 예제 7.5 (2/2) (b) Taylor 공식의 n개의 항을 더하여 sin(x)를 계산하는 사용자정의 함수 파일.
예제 (2/2) function y = Tsin(x, n) % Tsin 은 Taylor 공식에 의해 sin을 계산한다. % 입력인자 : % x는 각도 % n은 항의 개수 xr = x*pi/180; y = 0; for k= 0: n-1 y = y + (-1)^k*xr^(2*k+1)/factorial(2*k+1); end >> Tsin(150, 3) ans = 0.6523 >> Tsin(150, 7) 0.5000 명령창 (b) Taylor 공식의 n개의 항을 더하여 sin(x)를 계산하는 사용자정의 함수 파일. 첫 번째 항은 k=0에 해당하므로, 마지막 루프 인덱스는 k=n-1이 되어야 n개의 항을 더한 셈이 된다. 7장 MATLAB 프로그래밍

52 예제 7.6 벡터 원소의 수정 벡터 V=[5, 17, -3, 8, 0, -7, 12, 15, 20, -6, 6, 4, -2, 16]의 원소 중에서 양수이면서 3이나 5, 또는 3과 5로 나누어 떨어지는 원소는 2를 곱하고, 음수이면서 -5보다 큰 원소는 세제곱을 하는 프로그램을 스크립트 파일로 작성하라. V=[5, 17, -3, 8, 0, -7, 12, 15, 20, -6, 6, 4, -2, 16]; n=length(V); for k=1:n if V(k)>0 & ( rem(V(k), 3)==0 | rem(V(k), 5)==0 ) V(k)=2*V(k); elseif V(k) < 0 & V(k) > -5 V(k)=V(k)^3; end V >> Exp7_5 V = for-end 루프에서 반복횟수는 벡터의 원소 개수와 같다. 매회 반복할 때마다 조건문에서 한 원소씩 체크한다. 원소가 문제의 조건을 만족하면, 새로 계산한 값으로 원소를 대체한다. 7장 MATLAB 프로그래밍

53 while-end 루프 (1/3) while-end 루프는 반복실행이 필요하지만 반복횟수를 미리 모르는 경우에 사용된다. 따라서 while 루프에서는 루프가 시작될 때 반복회수가 지정되지 않는 대신 while 문의 조건식이 만족될 때까지 루프가 반복된다. while-end 루프 구조 명령어 명령 그룹 거짓 조건식 명령 그룹 n ………… while 조건식 …… end 명령어 그룹 MATLAB 프로그램 while의 조건식이 만족(참)되면, while과 end 사이의 명령어 그룹을 수행시킨 후 조건식으로 돌아가서 조건식의 만족여부를 다시 체크한다. 조건식이 만족되지 않으면(거짓), end로 건너뛰어 루프를 종료한다. 7장 MATLAB 프로그래밍

54 while-end 루프 (2/3) while-end 루프가 정상적으로 수행되기 위해서는 while 루프의 적용 예
처음으로 while 명령어를 수행할 때 조건식에 포함된 변수는 while 명령어 이전에 미리 값을 할당받은 상태이어야 한다. 조건식의 변수들 중에서 적어도 하나는 while과 end 사이의 명령어에서 새로운 값을 할당받아서 while 명령어의 조건식이 거짓이 되도록 만들어야 한다. 그렇지 않으면, 루프는 조건식을 거짓으로 만들수가 없으므로 무한 루프를 돌게 되어 루프를 빠져 나올 수 없게 된다. while 루프의 적용 예 m = 2 4 8 m=1; while m <= 7 m = 2*m end 명령어 창 실행 7장 MATLAB 프로그래밍

55 while-end 루프 (3/3) 무한 루프의 예 : m=8; while m ~= 0 m = m – 3; end
while 루프는 어떤 조건이 만족되는 동안 명령어 그룹을 반복 수행하고자 할 때 주로 사용된다. 일반적으로 while 루프를 for 루프로 수행할 수 있지만, 이런 경우에는 for 루프로 구현하기가 좀 더 까다로운 경우가 많다. m=8; while m ~= 0 m = m – 3; end m이 8, 5, 2, -1, … 과 같이 변하게 되어 정확히 0과 같은 값을 갖지 못하므로 조건식을 거짓으로 만들 수 없다. 따라서 무한 루프를 돌게 된다. n=1; while n ~= 5 disp(n) n=n+1; for n=1:4 7장 MATLAB 프로그래밍

56 while 루프와 for 루프 (1/2) eps()의 크기를 추정하는 프로그램
EPS=1; n=0; while 1+EPS > 1 EPS = EPS/2; n = n + 1; end EPS = EPS*2 EPS=1; for n=1 : 1000 if (1+EPS)==1 break; 프로그램이 무한 루프에 빠지게 된 경우, 키보드의 Ctrl + C 또는 Ctrl + Break 키 조합을 누름으로써 프로그램의 수행을 중지시킬 수 있다. 7장 MATLAB 프로그래밍

57 while 루프와 for 루프 (2/2) 1부터 N까지의 정수의 합을 구하는 프로그램
n! ≤ 100 을 만족하는 가장 큰 정수 n을 구하는 프로그램을 작성하라. n=1; while prod(1:n) < 100 n = n + 1; end n = n - 1 1부터 N까지의 정수의 합을 구하는 프로그램 N=100; sum = 0; for i = 1 : N sum = sum + i; sum N=100; sum = 0; k = 1; while k <= N sum = sum + k; k = k + 1; 7장 MATLAB 프로그래밍

58 예제 7.7 함수의 Taylor 급수 표현 Taylor 급수를 이용하여 f(x)=ex = 를 계산하는 스크립트 파일을 작성하라. 더할 항의 절대값이 보다 작으면 이 항을 무시하고 이전 항까지의 합을 구한다. while-end 루프를 사용하되, 반복횟수는 30으로 제한한다. 30 번째 반복에서 더할 항이 보다 작아지지 않으면, 루프를 중지하고 30 개 이상의 항이 필요하다는 메시지를 출력하라. 이 프로그램을 이용하여 e2, e-4, e21 을 계산하라. x=input('x를 입력하시오 : '); n=1; an=1; S=an; while abs(an) >= & n <= 30 an=x^n/factorial(n); S=S+an; n=n+1; end if n >= 30, disp('30개보다 많은 항이 필요하다.') else fprintf('exp(%f) = %f', x, S) fprintf('\n사용된 항의 개수는 %i 개이다.\n', n) >> expox x를 입력하시오 : 2 exp( ) = 사용된 항의 개수는 12 개이다. x를 입력하시오 : 21 30개보다 많은 항이 필요하다. 7장 MATLAB 프로그래밍

59 중첩 루프와 중첩 조건문 루프와 조건문은 또 다른 루프나 조건문 속에 중첩될 수 있으며, 중첩될 수 있는 루프와 조건문의 수에는 제한이 없다. 그러나 if, case, for, while 문 각각에 해당하는 end 문을 잊지 않도록 해야 한다. for k=1:n for h=1:m …… end ………… 중첩(된) 루프 루프 예) for k=1:3 for h=1:4 명령어 그룹 k=1로 시작하여 중첩 루프를 h=1, 2, 3, 4에 대해 4번 실행한다. 다음, k=2에서 중첩 루프는 다시 h=1, 2, 3, 4로 4번 실행한다. 결국 모두 3 x 4 = 12번 명령어 그룹을 실행한다. 7장 MATLAB 프로그래밍

60 예제 7.8 루프에 의한 행렬 생성 다음 조건의 원소들을 갖는 n×m 행렬을 생성하는 스크립트 파일을 작성하라. 첫째 행의 원소는 해당 원소가 속한 열의 번호와 같다. 첫째 열의 원소들은 해당 원소의 행의 번호와 같다. 나머지 원소들은 자기 바로 위의 원소와 자기 왼쪽 원소를 더한 값과 같다. n과 m의 값은 프로그램이 실행될 때 입력되도록 작성한다. n=input('행의 개수를 입력하시오: '); m=input('열의 개수를 입력하시오: '); A=[]; for k=1:n for h=1:m if k==1 A(k, h)=h; elseif h==1 A(k, h)=k; else A(k, h)=A(k, h-1) + A(k-1, h); end A 첫째 루프의 인덱스 변수 k는 행의 주소이며, 둘째 루프의 인덱스 변수 h는 열의 주소이다. >> Chap7_exp7 행의 개수를 입력하시오: 4 열의 개수를 입력하시오: 5 A = 7장 MATLAB 프로그래밍

61 break와 continue break 명령어 continue 명령어
break 명령이 for와 while 루프 안에 있으면, 루프의 실행을 즉시 중지하고 루프 밖의 다음 명령어로 넘어간다. 즉, break는 어떤 조건이 만족될 때 루프를 빠져나가기 위한 수단을 제공한다. 예) 루프의 횟수가 정해진 값을 초과하거나 수치계산에서 오차가 정해진 값보다 작아지면 루프를 종료한다. break 명령어가 중첩된 루프내에 있다면, break가 포함된 루프만 중지된다. break 명령어가 스크립트 파일이나 함수 파일에서 for 루프나 while 루프 밖에 있다면, 해당 위치에서 스크립트 파일이나 함수 파일의 실행을 종료한다. 예) 함수 파일로 전달된 데이터가 원하는 것과 일치하지 않는 경우, break 명령어로 함수 파일의 실행을 중지시킨다. continue 명령어 continue 명령어가 for와 while의 루프 안에서 사용되면, 현재 수행중인 반복과정을 중지하고 루프의 다음 반복과정으로 넘어간다. MATLAB이 continue 명령어를 만나게 되면, 루프의 나머지 명령들을 실행하지 않고 루프의 end 명령어로 건너뛴 후, 다시 루프를 계속 반복한다. 7장 MATLAB 프로그래밍

62 예제 loop와 break >> whileloop 반복 회수를 입력하시오( < 100) : 5 번호 = 5 5번 반복하였습니다. 반복 회수를 입력하시오( < 100) : 0 사용자가 어떤 수를 입력하면, 1부터 그 수까지 센 후 다시 반복회수를 묻는 프로그램을 작성하라. 0을 입력하면 프로그램은 종료된다. while 1 n = input('반복 회수를 입력하시오( < 100) : '); if n <= 0 fprintf('\n'), break; end fprintf(' \n'), fprintf('번호 = ') for i =1 : n fprintf( '%2d' , i) if i < n, pause(0.6), fprintf('\b\b'), end fprintf('\n%d번 반복하였습니다.\n', n) fprintf(' \n\n') 7장 MATLAB 프로그래밍

63 예제 7.9 퇴직연금계정 인출 (1/3) 한 퇴직자가 연리 5%의 저축계좌에 $300,000을 예금한다. 이 퇴직자가 1년에 1회씩 계좌에서 돈을 인출하려고 한다. 1년 후 $25,000 인출을 시작으로, 인플레이션 비율에 따라 인출금액을 증가시킨다. 인플레이션 비율이 예를 들어 3%라면, 2년 후에는 $25,750($25,000ⅹ1.03)을 인출한다. 인플레이션 비율이 매년 2%로 일정하다고 가정하여, 계좌의 예금이 유지되는 년수를 계산하라. 경과 년수에 대한 매년 인출금액과 계좌잔고를 보여 주는 그래프를 그려라. 풀이 루프가 시작되기 전에 반복횟수가 알려져 있지 않으므로, while 루프를 이용한다. 루프를 반복할 때마다 인출할 금액과 계좌잔고가 계산된다. 계좌잔고가 인출할 금액보다 크거나 같은 한, 루프는 계속 반복된다. $300,000 $315,000 $290,000 $25,000 인출 $304,500 $279,000 $25,500 인출 (25,000x1.02) $292,950 $266,940 1년 후 2년 후 3년 후 $26,010 인출 (25,500x1.02) 7장 MATLAB 프로그래밍

64 예제 (2/3) 계좌잔고 > 인출금액 인출금액 벡터 W 갱신 계좌잔고벡터 AB 갱신 yes 초기 설정, 1년 뒤 인출금액/잔고 계산 1년 뒤 잔고 계산 1년 뒤 인출금액 계산 경과년 수 갱신 결과 및 그래프 출력 No AB(1)=300,000 $315,000 AB(2)=290,000 W(2)=25,000 $304,500 AB(3)=279,000 W(3)=25,500 $292,950 AB(4)=266,940 1년 후 2년 후 3년 후 W(4)=26,010 ABnext clear W AB year rate=0.05; inf=0.02; % rate: 예금금리, inf: 인플레이션율 year(1)=0; % year : 경과년수 W(1)=0; % W : 매년 인출금액 AB(1)=300000; % AB : 매년 예금잔고(인출 직후) Wnext=25000; % 다음 해의 인출금액 ABnext=300000*(1 + rate); % 다음해의 잔고 n=2; while ABnext >= Wnext year(n)=n-1 W(n)=Wnext AB(n)=ABnext-W(n) ABnext=AB(n)*(1+rate); Wnext=W(n)*(1+inf); n=n+1; end fprintf('계좌의 잔고는 %d년 동안 유지된다.\n', year(n-1) ) bar(year, [AB' W'], 2.0) 7장 MATLAB 프로그래밍

65 예제 (3/3) >> Chap7_exp9 year = W = AB = year = W = AB = year = W = AB = …….. 계좌의 잔고는 15년 동안 유지된다. ……. fprintf('계좌의 잔고는 %d년 동안 유지된다.\n', year(n-1) ) bar(year, [AB' W'], 2.0) 파일명 : Chap7_exp9 7장 MATLAB 프로그래밍

66 예제 7.10 복권번호의 선택 (1/3) 복권 구입자는 숫자 목록에서 여러 개의 수를 선택해야 한다. 수 a와 b 사이에 균일하게 분포된 n개의 정수 리스트를 생성하는 사용자정의 함수를 작성하라. 생성된 리스트의 정수들은 모두 서로 달라야 한다. a) 함수를 이용하여 1부터 49까지의 정수 중에서 6개의 정수 리스트를 생성하라. b) 함수를 이용하여 60부터 75까지의 정수 중에서 8개의 정수 리스트를 생성하라. c) 함수를 이용하여 -15부터 15까지의 정수 중에서 9개의 정수 리스트를 생성하라. 풀이 수가 모두 서로 다르게 하나씩 선택한다. rand 함수로 수를 하나씩 선택하여 이미 정해진 수들과 비교하고 같은 수가 있으면 선택한 수를 버리고 다시 새 수를 선택한다. 3 42와 같은 원소가 있는지 확인 42 46과 같은 원소가 있는지 확인 46 42와 같은 원소 42가 있으므로 추가하려던 42 대신 다른 난수(34)를 다시 구한 후 다시 3, 42, 46과 같은지 비교한다. 34 7장 MATLAB 프로그래밍

67 예제 7.10 복권번호의 선택 (2/3) function x = lotto(a,b,n)
예제 7.10 복권번호의 선택 (2/3) function x = lotto(a,b,n) % lotto는 (a,b)의 영역에서 서로 다른 n개의 정수를 선택한다. % x는 n개의 정수를 가진 벡터이다. x(1)=round((b-a)*rand+a); % a와 b 사이의 첫 번째 정수 선택 for p=2:n x(p)=round((b-a)*rand+a); % 그 다음 수를 x(p)에 할당함 r=0; while r==0 r=1; for k=1:p-1 if x(k)==x(p) x(p)=round((b-a)*rand+a); break end while 루프는 새로 x(p)에 추가할 정수가 이미 들어 있는(확정된) 원소와 다름을 확인하기 위해 for 루프에서 차례로 비교하여 혹시 일치하는 수가 있으면 끝까지 비교할 필요가 없으므로 break에 의해 for 루프를 빠져 나가 새로 x(p)를 할당한 후 다시 while 루프를 다시 시작한다. 7장 MATLAB 프로그래밍

68 예제 7.10 복권번호의 선택 (3/3) >> lotto(1,49,6) ans = 3 42 46 34 37 20
예제 7.10 복권번호의 선택 (3/3) >> lotto(1,49,6) ans = >> lotto(60,75,8) >> lotto(-15,15,9) 7장 MATLAB 프로그래밍

69 예제 7.11 로켓모델의 비행 (1/4) 로켓이 처음 0.15 s 동안 엔진에 의해 16 N의 힘으로 위로 추진되며, 이후에는 중력 때문에 점점 느려진다. 정점에 도달한 후, 로켓이 아래로 떨어지기 시작해서 속도가 20 m/s에 도달하면, 낙하산이 펴지며 이후 땅에 닿을 때까지 20 m/s의 일정한 속도로 계속 내려온다. 로켓이 비행하는 동안, 로켓의 속도와 고도를 시간의 함수로 계산하고 그래프로 출력하는 프로그램을 작성하라. 풀이 구간 1 : 엔진이 켜진 처음 0.15 s 동안의 운동 이 구간 끝 t =0.15 s에서의 시간, 속도, 높이를 t1, v1, h1이라고 하자. 구간 2 : 엔진이 멈춘 뒤부터 낙하산이 펴질 때까지의 운동 이 구간은 일정한 감속도 g로 움직이며, 로켓 속도가 -20 m/s(아래 방향)가 될 때까지 계속되며, 구간 끝에서의 시간과 높이는 t2, v2, h2라고 한다. 7장 MATLAB 프로그래밍

70 예제 7.11 (2/4) 구간 3 : 낙하산이 펴진 때부터 로켓이 땅에 닿을 때까지의 운동
예제 (2/4) 구간 3 : 낙하산이 펴진 때부터 로켓이 땅에 닿을 때까지의 운동 이 구간에서는 로켓 속도가 -20 m/s로 일정하며, 로켓 높이가 0이 될 때까지이다. m=0.05; g=9.81; tEngine=0.15; Force=16; vChute=-20; Dt=0.01; clear t v h n=1; t(n)=0; v(n)=0; h(n)=0; % 구간 l a1=(Force-m*g)/m; while t(n) < tEngine & n < 50000 n=n+1; t(n)=t(n-1) + Dt; v(n)=a1*t(n); h(n)=0.5*a1*t(n)^2; end v1=v(n); h1=h(n); t1=t(n); % 1구간 끝에서의 속도, 높이, 시간 7장 MATLAB 프로그래밍

71 예제 7.11 (3/4) % 구간 2 while v(n) >= vChute & n < 50000 n=n+1;
예제 (3/4) % 구간 2 while v(n) >= vChute & n < 50000 n=n+1; t(n)=t(n-1)+Dt; v(n)=v1-g*(t(n)-t1); h(n)=h1+v1*(t(n)-t1)-0.5*g*(t(n)-t1)^2; end v2=v(n); h2=h(n); t2=t(n); % 구간 3 while h(n) > 0 & n < 50000 v(n)=vChute; h(n)=h2+vChute*(t(n)-t2); subplot(1,2,1), plot(t,h,t2,h2,'o') subplot(1,2,2), plot(t,v,t2,v2,'o') 7장 MATLAB 프로그래밍

72 예제 (4/4) 결과의 정확도는 시간 증분 Dt의 크기에 따라 좌우된다. Dt=0.01초의 설정이 좋은 결과를 준 것으로 보인다. while 명령어의 조건식은 n이 50,000보다 크면 루프를 멈추도록 n에 대한 조건도 포함하고 있는데, 이것은 루프 내의 명령문에 에러가 있을 경우 무한루프를 피하기 위한 예방책이다. 이 문제는 여러 방법으로 프로그래밍할 수 있다. 예를 들어, 낙하산이 펴지는 시간과 로켓이 땅에 닿는 시간을 먼저 계산하여, while 루프 대신 for-end 루프를 사용할 수도 있다. 시간이 처음 결정되면, 루프 대신 원소별 계산을 이용할 수도 있다. 7장 MATLAB 프로그래밍

73 예제 7.12 교류-직류 변환기 (1/3) 반파 다이오드 정류기는 AC 전압을 DC 전압으로 변환한다. 전압원은 vs=v0 sin( t)이다. 단,  =2 f. 첫 사이클에서 다이오드는 t =0에서 t=tA까지 켜진 상태(전류 통과)이다. t =tA에서 다이오드가 꺼지고 커패시터의 방전에 의해 저항에 전력이 공급된다. t =tB 에서 다이오드가 다시 켜지며 t =tD 까지 전류 가 통한다. 사이클은 전압원이 켜져 있는 한 계속된 다. 다이오드가 켜지면, 저항의 전압과 전류, 커패 시터의 전류는 다이오드가 꺼지면, 저항기 양단의 전압은 vR=v0 sin(t), iR= v0 sin(t)/R, iC =  Cv0 cos(t) 다이오드가 꺼지는 시간 tA, tD는 iR=-iC 의 조건으로 구한다. 전원 전압이 저항 양단의 전압에 도달하면 다이오드가 다시 켜진다. 시간 0≤t≤70 ms에 대한 저항 양단 전압 vR과 전원 전압 vS의 그래프를 그리는 프로그램을 작성하라. R=1800 Ω, v0=12 V이고, f=60 Hz이다. C=45 μF과 C=10 μF에 대해 프로그램을 각각 실행하라. 전압원의 전압 vs 저항기 양단 전압 vR 7장 MATLAB 프로그래밍

74 예제 (2/3) V0=12; C=10e-6; R=1800; f=60; f=70e-3; w=2*pi*f; clear t VR Vs t=0:0.05e-3:Tf; n=length(t); state=‘on’ for i=1:n Vs(i)=V0*sin(w*t(i)); switch state case 'on' VR(i)=Vs(i); iR=Vs(i)/R; iC = w*C*V0*cos(w*t(i)); sumI = iR + iC; if sumI <= 0, state='off ';tA=t(i); end case 'off ' VR(i) = V0*sin(w*tA)*exp(-(t(i)-tA)/(R*C)); if Vs(i) >= VR(i), state='on'; end end plot(t, Vs, ':', t, VR, 'k', 'linewidth', 1) xlabel('시간 (s)'); ylabel('전압 (V)') 프로그램은 다이오드가 켜져 있을 때의 전압을 계산하는 부분과 다이오드가 꺼져 있을 때의 전압을 계산하는 부분으로 구성된다. 두 부분 사이의 스위칭은 switch 명령어로 한다. 계산은 다이오드가 켜진 상태(변수 state='on')에서 시작되며, iR+iC≤0이 되면 변수 state의 값이 ‘off'로 바뀌면서 off 상태에서의 vR을 계산하는 명령어로 프로그램이 바뀐다. 이 계산은 vs≥vR이 되어 다이오드가 켜졌을 때의 식으로 다시 바뀔 때까지 계속된다. 7장 MATLAB 프로그래밍

75 예제 (3/3) C = 45 μF C = 10 μF 7장 MATLAB 프로그래밍

76 7장 강의록 끝 7장 끝 7장 MATLAB 프로그래밍


Download ppt "MATLAB 개요와 응용 7장 MATLAB 프로그래밍"

Similar presentations


Ads by Google