matlab 7 matlab n.
Download
Skip this Video
Loading SlideShow in 5 Seconds..
MATLAB 개요와 응용 7 장 MATLAB 프로그래밍 PowerPoint Presentation
Download Presentation
MATLAB 개요와 응용 7 장 MATLAB 프로그래밍

Loading in 2 Seconds...

play fullscreen
1 / 76

MATLAB 개요와 응용 7 장 MATLAB 프로그래밍 - PowerPoint PPT Presentation


  • 597 Views
  • Uploaded on

MATLAB 개요와 응용 7 장 MATLAB 프로그래밍. 강의 내용. 관계 연산자와 논리 연산자 조건문 Switch-case 문 루프 (loop) 중첩 루프와 중첩 조건문 break 명령어와 continue 명령어 응용예제. 프로그래밍 개요 (1/2). 컴퓨터 프로그램은 원하는 목적을 얻기 위해 작성된 일련의 컴퓨터 명령어들이다 . 간단한 프로그램에서는 순차적으로 명령어가 수행되지만 , 좀 더 정교한 프로그램에서는 입력된 변수의 값이나 상태에 따라 수행될 명령어가 결정된다 .

loader
I am the owner, or an agent authorized to act on behalf of the owner, of the copyrighted work described.
capcha
Download Presentation

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


An Image/Link below is provided (as is) to download presentation

Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.


- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -
Presentation Transcript
slide2
강의 내용
  • 관계 연산자와 논리 연산자
  • 조건문
  • Switch-case 문
  • 루프(loop)
  • 중첩 루프와 중첩 조건문
  • break 명령어와 continue 명령어
  • 응용예제

7장 MATLAB 프로그래밍

slide3
프로그래밍 개요 (1/2)
  • 컴퓨터 프로그램은 원하는 목적을 얻기 위해 작성된 일련의 컴퓨터 명령어들이다. 간단한 프로그램에서는 순차적으로 명령어가 수행되지만, 좀 더 정교한 프로그램에서는 입력된 변수의 값이나 상태에 따라 수행될 명령어가 결정된다.

예) 우체국에서 소포 요금을 계산할 때, 소포의 중량과 크기, 소포의 내용물, 배송방법(특급, 빠른 우편, 보통 등) 등에 따라 다른 계산식을 사용한다.

  • 동일한 과정의 명령어 그룹을 반복해서 수행해야 할 경우도 있다.

예) 방정식을 수치적으로 풀 때, 구하는 답의 오차가 어떤 기준보다 작아질 때까지 일련의 계산과정을 반복적으로 수행해야 한다.

  • MATLAB은 프로그램의 흐름을 제어할 수 있는 여러 도구들을 제공한다.
    • 조건문(conditional statement)과 switch구조는 상황에 따라 명령어들을 건너뛰거나 특정 그룹의 명령어들을 실행시킬 수 있다.
    • For루프와 while루프는 어떤 명령어 그룹을 여러 번 반복 수행시킬 수 있다.

7장 MATLAB 프로그래밍

slide4

프로그래밍 개요 (2/2)

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

7장 MATLAB 프로그래밍

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

7장 MATLAB 프로그래밍

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

7장 MATLAB 프로그래밍

flowchart

시작

연산

논리 표현

연산 1

연산 2

종료

흐름도(Flowchart)*
  • 프로그램의 흐름을 실제 프로그래밍 언어를 사용하지 않고 그림과 간단한 글이나 식으로 표시하는 것으로 긴 프로그램을 작성할 때 도움이 된다.

7장 MATLAB 프로그래밍

relational operator 1 5
관계연산자(Relational operator) (1/5)
  • 관계연산자는 두 수를 비교하여 결과가 참인지 거짓인지를 결정한다. 결과가 참이면 1을, 거짓이면 0의 값을 준다.
  • 관계연산자는 수학식 안에서 산술 연산자처럼 사용될 수 있으며, 결과는 배열의 주소 지정에 사용되거나 MATLAB의 다른 명령어들과 함께 사용되어 프로그램의 흐름을 제어할 수 있다.

7장 MATLAB 프로그래밍

slide9

>> bool = 4 < 10% 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 = 1 2 3 4 5

y = 1 4 5 3 2

>> z=x>=y% z = (x >= y)와 같다

z = 1 0 0 1 1

>> a =x ==y% a=(x==y), 원소별로 x 와 y의 값이 같으면 참이다.

a= 1 0 0 00

>> b =x ~=y% 원소별로 x 와 y의 값이 같지 않으면 참이다.

a= 01111

관계연산자(2/5)

  • 크기가 같은 두 배열을 비교하면, 원소 대 원소 별로 비교하여각 원소의 비교 결과에 따라 0과 1을 갖는같은 크기의 논리배열(logical arry)을 출력한다. 스칼라를 배열과 비교하면, 스칼라는 배열의 모든 요소와 비교되어 비교 결과에 따라 0과 1을 갖는 논리배열을 출력한다.

7장 MATLAB 프로그래밍

slide10

관계연산자(3/5)

>> x=randperm(5), y=randperm(5)

x = 5 3 4 2 1

y = 2 4 5 3 1

>> z = x – y > 0% 산술연산을 먼저 한 후 각 원소를 0과 비교

x = 1 0 0 0 0

>> z=x>=y% z = (x >= y)와 같다

z = 1 0 0 1 1

>> z=x(x<y)

z =

3 4 2

>> X = [8 1 6; 3 5 7; 4 9 2];

>> B = X >= 4

B =

1 0 1

0 1 1

1 1 0

7장 MATLAB 프로그래밍

slide11

관계연산자(4/5)

>> A=[ 2 7 6; 4 -2 5]; B = [2 8 0.5; 6 -1 5];

>> C1 = A > B

C1 = 0 0 1

0 0 0

>> C2 = A <= B

C2 = 1 1 0

1 1 1

>> C3 = A == B

C3 = 1 0 0

0 0 1

>> C4 = A ~= B

C4 = 01 1

1 1 0

>> C5 = A – ( B > 4 )

C5 = 266

3-24

7장 MATLAB 프로그래밍

slide12

>> v = [7 12 8 3 15 24 6];

>> bool = v <= 8 % 벡터 v의 원소들이 8이하인지 비교한다.

bool = 1 0 1 1 0 0 1

>> w = v(bool) % 논리벡터를 이용한 벡터 v의 원소 추출

w = 7 8 3 6

>> w = v( v <=8 )

w = 7 8 3 6

>> n = [1 0 1 1 0 0 1];

>> v(n)

??? Subscript indices must either be real positive integers or logicals

>> v( [1 1 4 5] ) % 일반적인 배열의 주소 지정

ans =

7 7 3 15

n은 논리벡터가 아니므로 주소 지정에 사용될 수 없다.

관계연산자(5/5)

  • 관계연산의 결과로 얻어진 논리벡터를 다른 벡터 v의 주소 지정에 사용하면, 논리벡터의 원소가 1인 위치에 해당하는 벡터 v의 원소만 추출해 준다.

7장 MATLAB 프로그래밍

slide13

>> 3+4<16/2 % 더하기와 나누기가 먼저 실행되므로 “7 < 8”의 결과는 1임

ans =

1

>> A = [ 2 3 0; 1 0 4];

>> A = A + (A==0)*eps;% A의 원소중에 0이 있으면, 0 대신 eps로 대체함

>> format long e, A

A =

2.000000000000000e+000 3.000000000000000e+000 2.220446049250313e-016

1.000000000000000e+000 2.220446049250313e-016 4.000000000000000e+000

>> eps % eps : floating point relative accuracy(ε)

ans = 2.2204e-016

관계연산자의 응용 (1/2)

  • 논리벡터가 산술연산에 사용되면, 논리벡터는 먼저 수치벡터로 변환된다.
  • 산술연산자(+, -, *, /, \ )는 관계연산자보다 연산 순위가 우선이다.

예) z= 5 > 2 + 7 vs. z = 5 > (2 + 7)

  • 분모가 0이 되어 계산을 못 하게 되는 에러를 막기 위한 기법으로 관계연산자를 이용할 수 있다*.

7장 MATLAB 프로그래밍

slide14

>> x = -10 : 10 ; % 벡터 x에 0이 포함됨

>> y = sin(x) ./x ; grid on

Warning: Divide by zero.

y =

Columns 1 through 8

-0.0544 0.0458 0.1237 0.0939 -0.0466

……

Columns 17 through 21

-0.0466 0.0939 0.1237 0.0458 -0.0544

>> plot(x, y)

  • “Divide by zero” 의 수정

>> x = -10 : 10;

>> x = x + (x==0)*eps ;

>> y = sin(x) ./x

>> plot(x, y); grid on

관계연산자의 응용*(2/2)

  • sinc 함수 의 그래프 그리기

7장 MATLAB 프로그래밍

logical operator 1 4
논리연산자(Logical operator) (1/4)
  • MATLAB의 논리 연산자
  • 논리연산자는 숫자에 대해 작용하며, 0이 아닌 숫자는 모두 참(true)으로 보며, 0은 거짓(false)이다.

7장 MATLAB 프로그래밍

slide16

>> x=[5 -3 0 0]; y=[2 0 4 0];

>> x | y

ans = 1 1 1 0

>> xor( x, y)

ans = 0 1 1 0

>> x & y

ans = 1 0 0 0

% 0<x<7의 MATLAB 표현

>> 0 < x & x < 8

ans =

1 0 0 0

>> (0 < x) & (x < 8)

ans =

1 0 0 0

>> bool = 2 & -1

bool = 1

>> bool = 1 | 0

bool = 1

>> ~5

ans = 0

논리연산자(2/4)

  • MATLAB의 논리 연산자

7장 MATLAB 프로그래밍

slide17

같은 우선순위를 가진 연산자가 둘 이상 있는 경우, 왼쪽에서 오른쪽 순서로 연산을 수행한다.

논리연산자(3/4)

  • 논리연산자는 수학식 안에서 산술 연산자처럼 사용될 수 있으며, 결과는 다른 수학식이나 배열의 주소 지정에 사용될 수 있고 MATLAB의 다른 명령어(예를 들어 if)와 함께 사용되어 프로그램의 흐름을 제어할 수 있다.
  • 논리연산자는 스칼라와 배열에 사용될 수 있으며 서로 섞어 쓸 수 있다.
  • 논리연산자는 산술연산자(+, -, *, /, \ )와 관계연산자보다 우선 순위가 늦다.단, NOT(~) 연산자는 괄호와 거듭제곱(^) 다음으로 우선 순위가 높음.
  • 연산자의 우선 순위

1순위 : 괄호(괄호가 중첩되어 있는 경우, 가장 안쪽 괄호가 최우선 순위)

2순위 : 거듭제곱(^)

3순위 : Logical NOT(~)

4순위 : 곱하기, 나누기

5순위 : 더하기, 빼기

6순위 : 관계연산자( >, <, >=, <=, ==, ~= )

7순위 : 논리연산자 AND(&)

8순위 : 논리연산자 OR( | )

7장 MATLAB 프로그래밍

slide18

x==3의 결과가 0이므로 (y <4)와 상관없이 답이 0이므로 (y<4)는 실행되지 않는다.

x==2의 결과가 1이므로 y > 4와 상관없이 결과가1이므로 y > 4는 실행되지 않는다.

  • MATLAB버전 6 이전에는 우선순위에 변동이 있으므로 괄호를 사용하는 것이 안전하다.

논리연산자(4/4)

>> x = -2; y = 5;

>> 5 < x & x < -1

ans = 0

>> -5 < x & x < -1 % -5 < x → 1, x<-1 → 1 이므로 1 & 1 → 1이다.

ans = 1

>> ~(y < 7) % y < 7 → 1이므로 ~1 → 0

ans = 0

>> ~y < 7 % ~y→ 0이므로 0 <7 → 1

ans = 1

>> ~( (y>=8) | (x <-1) ) % y>=8 →0, x<-1 → 1이므로 ~(0|1) →0

ans = 0

>> x=2; y=3; x==3 && y < 4

ans = 0

>> x==2 || y > 4

ans = 1

7장 MATLAB 프로그래밍

slide19
내장 논리함수 (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 = [1 0 0; 0 0 3; 0 0 2];

>> any(A)

ans = 1 0 1

7장 MATLAB 프로그래밍

slide20

내장 논리함수 (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)

ans = 1

>> A(1,1)=5; A(2,2)=3

A = 5 0

0 3

>> isempty(A)

ans = 0

7장 MATLAB 프로그래밍

slide21

내장 논리함수 (3/4)

  • isinf(A) : A의 원소가 무한대이면 해당 원소 자리에 1을, 아니면 0을 가진, A와 같은 크기의 배열을 돌려준다.

>> x = [-2 -1 0 1 2];

>> isinf(1./x)

ans = 0 0 1 0 0

  • isnan(A) : A의 원소가 ‘NaN’이면 해당 원소 자리에 1을, 아니면 0을 가진, A와 같은 크기의 행렬을 돌려준다.

>> x = [-2 -1 0 1 2];

>> isnan(0./x)

ans = 0 0 1 0 0

  • logical(A) : 숫자배열 A를 논리배열로 바꾼다. >> x=[4 5 6 7]; bool=[1 0 0 1];

>> x(bool)

??? Subscript indices must either be real positive integers or logicals. >> k=local(bool); x(k)

x= 4 7

7장 MATLAB 프로그래밍

slide22

내장 논리함수 (4/4)

  • islogical(A) : A가 논리배열이면 1을, 아니면 0을 돌려준다.

>> x=[4 2 8 1]; y=[3 5 6 7];

>> bool = x > y

bool = 1 0 1 0

>> islogical(bool)

ans = 1

>> z = [ 1 0 1 0]; islogical(z)

ans = 0

  • isnumeric(A) :A가 숫자배열이면 1을, 아니면 0을 돌려준다.

>> isnumeric(bool)

ans = 0

>> isnumeric(z)

ans = 1

7장 MATLAB 프로그래밍

find 1 2

>> x=[ 1 0 -2]; y = [0 0 9]; A=[x; y];

>> find(x)

ans = 1 3

>> find(x & y)

ans = 3

>> [m, n, v] = find(A)

m = 1 n = 1 v = 1

1 3 -2

2 3 0

공간 제약으로 실제와 다르게 이렇게 표현함

A(1,1) → 1

A(1,3) → -2

A(2,3) → 0

내장 논리함수 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로 돌려준다.

7장 MATLAB 프로그래밍

slide24

>> A=[ 8 0 -2; 0 3 0; -4 0 9];

>> [m, n, v] = find(A > 3)

m =

1

3

n =

1

3

v =

1

1

>> find(0<A & A < 9)

ans =

1

5

내장 논리함수 find (2/2)

  • find(논리표현식)논리 표현식이 참(true)을 만족하게 하는 배열의 원소

주소를 돌려준다.

7장 MATLAB 프로그래밍

slide25

>> T=[24 25 24 28 30 32 29 26 23 33 31];

>> T30 = T >= 30;

ans = 0 0 0 0 1 1 0 0 0 1 1

>> T30Days = sum(T30)

T30No = 4

>> T25to28 = 25 <= T & T <= 28

T25to28 = 0 1 0 1 0 0 0 1 0 0 0

>> T25to28Days = sum(T25to28)

ans = 3

예제 온도 데이터의 분석 (1/2)
  • 대전의 7월 중순의 낮 최고 기온이 다음 표와 같다. 다음을 구하라.

1) 낮 최고기온이 30° 이상인 날은 모두 며칠인가?

2) 낮 최고기온이 25°~28°에 해당하는 날은 모두 며칠인가?

3) 낮 최고기온이 28°~32°에 해당하는 날짜는 언제입니까?

7장 MATLAB 프로그래밍

slide26

>> T28to32 = find( 28 <= T & T <= 32) + 10

ans = 14 15 16 17 21

예제 (2/2)

3) 낮 최고기온이 28°~32°에 해당하는 날짜는 언제입니까?

7장 MATLAB 프로그래밍

conditional statements

명령어

…………

…………

if 조건식

……

……

end

……

……

MATLAB 프로그램

거짓

if 문

MATLAB 명령어

그룹

명령어 그룹

명령어

MATLAB 프로그램

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

7장 MATLAB 프로그래밍

if 1 2

if x >=0, y = sqrt(x), end와 같이 한 줄로 쓸 수도 있다.

if x>=0 & y>= 0, z=sqrt(x)+y, w=log(x)–log(y), end 와 같이 한 줄로 쓸 수도 있다.

if 문 사용 예 (1/2)
  • 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)

end

7장 MATLAB 프로그래밍

slide29

n = input(‘홀수, 짝수를 판별할 숫자를 입력하시오 : ’);

if rem(n, 2) == 0

fprintf( ‘%d는(은) 짝수입니다.\n’, n);

end

if rem(n, 2) ~= 0

fprintf( ‘%d는(은) 홀수입니다.\n’, n);

end

  • 벡터의 평균값을 구하는 프로그램

>> ave

데이터를 입력하시오 : [1:10]

평균값은 5.50입니다.

>> ave

데이터를 입력하시오 :

??? Error using ==> ave

데이터가 입력되지 않았습니다.

x = input( '데이터를 입력하시오 : ');

n=length(x);

if (~n)

error( '데이터가 입력되지 않았습니다.')

end

avg = sum(x)/n;

fprintf( '평균값은 %.2f입니다.\n', avg)

if 문 사용 예 (2/2)

  • 사용자가 입력한 숫자의 홀, 짝수를 판정하는 프로그램

7장 MATLAB 프로그래밍

slide30

파일명 : workerpay

t=input('근무한 시간 수를 입력하시오: ');

h=input('시간당 임금을 달러로 입력하시오: ');

Pay=t*h;

if t>40

Pay=Pay+(t-40)*0.5*h;

end

fprintf('노동자의 임금은 $%5.2f입니다.\n', Pay)

>> Workerpay

근무한 시간 수를 입력하시오: 35

시간당 임금을 달러로 입력하시오: 8

노동자의 임금은 $280.00입니다.

예제 7.2 노동자의 급료 계산
  • 어떤 노동자가 기준 노동시간인 40시간까지는 자신의 시간당 임금에 따라 급료를 받으며, 초과시간에 대해서는 50%를 더 받는다. 이 노동자의 급료를 계산하는 프로그램을 스크립트 파일로 작성하라. 프로그램 실행시 사용자는 근로시간과 시간당 임금을 입력하게 되며, 프로그램은 급료를 출력한다.

7장 MATLAB 프로그래밍

if else end

…………

…………

if 조건 식

……

……

else

……

……

end

……

……

명령어

MATLAB 프로그램

거짓

if 문

MATLAB 명령어

그룹 1

명령 그룹 1

명령 그룹 2

MATLAB 명령어

그룹 2

명령어

MATLAB 프로그램

if – else – end 구조
  • 조건판단에 따라 실행해야 할 선택사항이 서로 상반된 두 가지일 경우 if-else-end 구조를 사용한다. 예를 들어 어떤 수의 짝수, 홀수 여부에 따라 다른 명령을 수행해야 할 경우, 짝수에 따른 명령과 홀수에 따른 명령은 서로 독립적이므로 두 가지 조건문이 필요하게 된다.

7장 MATLAB 프로그래밍

if else end1

n = input('홀수, 짝수를 판별할 숫자를 입력하시오 : ');

if rem(n, 2) == 0

fprintf('%d는(은) 짝수입니다.\n', n);

else

fprintf('%d는(은) 홀수입니다.\n', n);

end

  • 2 kg 이하 소포의 등기배달 요금은 4,000원, 보통배달 요금은 2,700원이다. 배달 종류에 따라 소포 세 개의 요금을 계산하는 프로그램을 작성하라.

n = input('소포의 개수를 입력하시오 : ');

type = input('소포의 배달 종류를 선택하시오(등기=1, 보통=0) :');

if type

charge=4000*n;

else

charge=2700*n;

end

fprintf('총 배달 요금은 %d입니다.\n', charge);

if – else – end 사용 예
  • 사용자가 입력한 숫자의 홀, 짝수를 판정하는 프로그램

7장 MATLAB 프로그래밍

slide33

탱크 안 물의 체적

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=12.5+10.5*(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)

ans =

1.4115e+004

>>

예제 7.3 급수탑의 물 높이
  • 급수탑 탱크는 원통인 밑부분과 원뿔대 모양의 윗부분으로 이루어져 있다. 탱크 안 부표(float)의 위치 h로부터 탱크 안 물의 체적을 구하는 사용자정의 함수를 작성하라. 입력은 h의 값(m)이고, 출력은 물의 체적(m3)이다.

7장 MATLAB 프로그래밍

if elseif else end

…………

…………

if 조건식

……

……

elseif 조건식

……

……

else

……

……

end

……

……

MATLAB 프로그램

명령어

거짓

if 문

MATLAB 명령어

그룹 1

거짓

elseif 문

MATLAB 명령어

그룹 2

명령 그룹 1

명령 그룹 2

명령 그룹 3

MATLAB 명령어

그룹 3

명령어

MATLAB 프로그램

if – elseif – else - end 구조
  • 서로 상반되는 조건이 여러 개일 때 사용하며, 조건의 개수에 따라 elseif를 추가하면 된다. else 문은 옵션으로 꼭 필요하지는 않다.

7장 MATLAB 프로그래밍

if elseif else end1

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

>> root2(3, -9, 4)

ans =

2.4574 0.5426

>> root2(5, -14, 13)

ans =

1.4000 + 0.8000i 1.4000 - 0.8000i

>> roots([5, -14, 13])% 내장함수 이용

ans =

1.4000 + 0.8000i

1.4000 - 0.8000i

>>

  • roots(C) : 다항식 anxn+an-1xn-1+…+a1x+a0=0의 계수 C=[an an-1 … a1a0]를 입력인자로 받아 해를 계산하여 벡터로 돌려준다.
if - elseif - else - end 사용 예
  • 2차방정식 ax2+bx+c=0의 근을 구하는 함수 프로그램을 작성하고, 3x2–9x+4 =0과 5x2–14x+13=0의 해를 각각 구하라.

7장 MATLAB 프로그래밍

slide36

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;

end

charge = unit*n;

fprintf('%s소포 요금은 총 %d원(%d원%d개)입니다.\n', str, charge, unit, n)

  • 비교)
  • if type ==‘Y’
  • str = '등기'; unit=4000;
  • else
  • str = '보통'; unit=2700;
  • end
문자열과 조건문
  • 예를 들어 ‘Yes’나 ‘No’와 같은 사용자의 문자열 입력에 따라 프로그램의 흐름을 제어하고자 하는 경우 , 조건문에서 문자열과의 비교가 필요하다.
  • 소포 요금 계산 프로그램 예제

7장 MATLAB 프로그래밍

if elseif else end2

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;

end

end

fprintf('\n소포 %d개의 %s 소포요금은 %d개x%d원=%d원입니다.\n\n', …

n, str, n, unit, n*unit)

if - elseif - else - end 사용 예
  • 소포 요금표를 이용하여 소포의 요금을 계산하는 프로그램을 작성하라.

7장 MATLAB 프로그래밍

switch case

명령어

…………

switch 표현식

case 값1

……

……

case 값2

……

……

otherwise

……

……

end

…………

MATLAB 프로그램

switch 문

값1

MATLAB 명령어

그룹 1

명령 그룹 1

값2

명령 그룹 2

MATLAB 명령어

그룹 2

그 외

명령 그룹 n

MATLAB 명령어

그룹 n

명령어

MATLAB 프로그램

switch-case 문
  • switch – case문은 switch 다음의 표현식의 값에 따라 여러 명령그룹들중에서 한 그룹을 골라 실행시킬 때 사용한다. switch문-case문은 if문을 사용하여 똑같이 실행시킬 수 있지만, switch문이 프로그램을 이해하기가 더 쉽다.
  • switch문의 구조

7장 MATLAB 프로그래밍

switch case1

route = input('원하는 노선을 선택하세요 : ');

switch route

case 1

fare = 1000;

case 2

fare = 1100;

case {3, 4, 5}

fare = 1200;

case 2

fare = 1300;

otherwise

disp( [int2str(route), '번은 없는 노선입니다.'] )

fare = 0;

end

if fare

fprintf('%d번 노선 요금은 %d원입니다.\n', route, fare)

end

  • switch다음의 표현식은 스칼라나 문자열, 값이 미리 정의된 변수나 정수 결과를 갖는 수학식이 될 수 있다.
  • route값이 2이면 case 2에 해당하는 명령어 그룹이 실행된다. 만일 case 2가 한 개 이상인 경우에는 처음 만나는 case문만 실행된다.
  • case 문은 2개 이상의 값을 가질 수 있으며, 이 경우 벡터 표시와 달리 ‘{ }’ 표시를 사용한다.
switch-case문의 사용 방법
  • 다음 예제를 통해 switch-case문의 사용방법에 대해 알아보자.

7장 MATLAB 프로그래밍

switch case2

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)

switch-case문의 사용 예
  • 주어진 단위의 길이를 cm 단위로 변환하는 프로그램을 작성해보자.

7장 MATLAB 프로그래밍

7 4 1 2

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.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로.

7장 MATLAB 프로그래밍

slide42

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)

end

명령창에서의 실행결과

>> >> EnergyConversion

변환할 에너지(일)의 값을 입력하시오: 2800

현재 단위를 입력하시오(J, ft-lb, cal, or eV): cal

새 단위를 입력하시오(J, ft-lb, cal, or eV): J

E = 11715.5 J

예제 7.4 (2/2)

7장 MATLAB 프로그래밍

loop for end loop 1 2

명령어

거짓

k ≤ 최종값

  • 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번 실행된다.

명령 그룹

k 값 수정

명령 그룹 n

Loop : for-end loop (1/2)
  • 루프는 명령어 그룹을 어떤 횟수만큼 반복 수행하며, 매회 반복시 적어도 1개 이상의 변수가 루프 내에서 새 값을 할당받는다. 루프에는 반복횟수가 지정된 for-end loop와 지정 조건이 만족될 때까지 반복되는 while-end loop가 있다.
  • for-end loop

for k = f : s: t

명령어 그룹

end

7장 MATLAB 프로그래밍

slide44

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=[5 3 8 -2 4], disp(k), end

  • k 값이 루프 내에서 다시 정의되어서는 안 된다.
  • 루프가 끝나면, 루프 인덱스 변수 k의 값은 마지막으로 할당받은 값이다. for 문에서 최종값과 비교할 때의 값이 아니라는 점에 주의하라.

7장 MATLAB 프로그래밍

for end 1

for k=1: 3: 10

x = k^2

end

>> for k=1:3:10, x=k^2, end

x =

1

x =

16

x =

49

x =

100

for-end 루프의 사용 예 1
  • 1, 4, 7, 10의 네 수의 제곱값을 차례대로 구하여 출력하라.

7장 MATLAB 프로그래밍

for end 2

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)

예를 들어 N=6인 경우, i는 1부터 2씩 증가하므로 세 번 루프를 돌며, i는 각 루프에서 1, 3, 5의 값을 갖는다. i=7은 최종값 6을 초과하므로 i=5가 최종값이 된다.

for-end 루프의 사용 예 2
  • 1부터 사용자가 입력한 N 까지의 모든 홀수들의 합과 곱을 구하는 프로그램을 작성하라.

7장 MATLAB 프로그래밍

for end 3

>> facto

계승(factorial)을 구할 수를 입력하시오 : 5

5! = 120

for-end 루프의 사용 예 3

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)

end

  • 사용자가 입력한 수 N의 계승(factorial)을 계산하는 프로그램을 작성하라.

7장 MATLAB 프로그래밍

for end 4

forx=[1 3 5 7 9]

y = sqrt(x);

end

x=[1 3 5 7 9]

y = sqrt(x)

vs.

  • for명령어에서 인덱스에 배열이 주어진 경우, 열벡터의 원소가 모두 수행될 때까지 열벡터가 순서대로 인덱스 변수에 대입되어 루프를 반복한다.

명령창에서의 실행결과

forn=A

fprintf('n=%d, ', n)

x=(n(3)-n(2))*n(1);

fprintf('x=%d\n', x)

end

n=2, n=8, n=9, x=2

n=4, n=5, n=8, x=12

n=6, n=7, n=11, x=24

for-end 루프 사용 예 4
  • for-end 루프를 사용한 결과와 원소별 연산을 사용한 결과가 같은 경우가 있는데, 일반적으로 원소별 연산이 루프보다 더 빠르며 두 방법 모두 사용 가능한 경우라면 원소별 원소 연산방법이 더 바람직하다.
  • 예제

for x=1:2:9

y = sqrt(x);

end

7장 MATLAB 프로그래밍

for end 5

실행결과

loop=1;

for i=[2.1 4.3 7.5 -6.8]

fprintf('loop No =%d, i=%4.1f\n', loop, i)

loop=loop+1;

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

  • 벡터 v의 원소 중에서 양의 원소의 주소를 알려 주는 프로그램

실행결과

v=[3 -2 0 8 -7];

n=0;

for m=1:length(v)

if v(m)>0

n=n+1;

y(n)=m

end

end

>> find_for

y=

1 4

>> find(x>0)

ans=

1 4

for-end 루프 사용 예 5
  • for 명령어의 루프 인덱스 변수에 실수도 사용될 수 있다.

7장 MATLAB 프로그래밍

7 5 1 2

(a) 루프를 반복할 때마다 급수의 각 항을 계산하고 이전 항들의 합에 더한다.

실행결과

n=input('항의 개수를 입력하시오: ');

s=0;

fork=1:n

s=s+(-1)^k*k/2^k;

end

fprintf('급수의 합은 %f 이다.\n', s)

>> Exp7_4a

항의 개수를 입력하시오: 4

급수의 합은-0.125000 이다.

>> Exp7_4a

항의 개수를 입력하시오: 20

급수의 합은-0.222216 이다.

예제 7.5 급수의 합 (1/2)

a) for-end루프를 이용하여 급수의 첫 n항의 합 을 계산하는 프로그램을 작성하고, n=4와 n=20에 대해 합을 구하라.

b) Taylor 급수를 이용하여 sin(x)를 계산하는 사용자정의 함수 파일을 작성하라. 함수 이름과 인자는 y=Tsin(x,n)으로 한다. 입력인자는 각도(°)인 x와 급수의 항의 개수인 n이다. 이 함수로 항의 개수가 3과 7일 때 sin(150°)를 계산하라.

7장 MATLAB 프로그래밍

slide51

(b) Taylor 공식의 n개의 항을 더하여 sin(x)를 계산하는 사용자정의 함수 파일.

첫 번째 항은 k=0에 해당하므로, 마지막 루프 인덱스는 k=n-1이 되어야 n개의 항을 더한 셈이 된다.

function y = Tsin(x, n)

% Tsin 은 Taylor 공식에 의해 sin을 계산한다.

% 입력인자 :

% x는 각도

% n은 항의 개수

xr = x*pi/180;

y = 0;

fork= 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)

ans =

0.5000

예제 7.5 (2/2)

7장 MATLAB 프로그래밍

slide52

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

end

V

for-end루프에서 반복횟수는 벡터의 원소 개수와 같다. 매회 반복할 때마다 조건문에서 한 원소씩 체크한다. 원소가 문제의 조건을 만족하면, 새로 계산한 값으로 원소를 대체한다.

>> Exp7_5

V =

10 17 -27 8 0 -7 24 30 40 -6 12 4 -8 16

예제 7.6 벡터 원소의 수정
  • 벡터 V=[5, 17, -3, 8, 0, -7, 12, 15, 20, -6, 6, 4, -2, 16]의 원소 중에서 양수이면서 3이나 5, 또는 3과 5로 나누어 떨어지는 원소는 2를 곱하고, 음수이면서 -5보다 큰 원소는 세제곱을 하는 프로그램을 스크립트 파일로 작성하라.

7장 MATLAB 프로그래밍

while end 1 3

명령어

…………

…………

while 조건식

……

……

end

…………

MATLAB 프로그램

거짓

조건식

명령어 그룹

명령 그룹

MATLAB 프로그램

  • while의 조건식이 만족(참)되면, while과 end 사이의 명령어 그룹을 수행시킨 후 조건식으로 돌아가서 조건식의 만족여부를 다시 체크한다. 조건식이 만족되지 않으면(거짓), end로 건너뛰어 루프를 종료한다.

명령 그룹 n

while-end 루프 (1/3)
  • while-end 루프는 반복실행이 필요하지만 반복횟수를 미리 모르는 경우에 사용된다. 따라서 while 루프에서는 루프가 시작될 때 반복회수가 지정되지 않는 대신 while 문의 조건식이 만족될 때까지 루프가 반복된다.
  • while-end 루프 구조

7장 MATLAB 프로그래밍

slide54

명령어 창 실행

m =

2

m =

4

m =

8

m=1;

while m <= 7

m = 2*m

end

while-end 루프 (2/3)

  • while-end 루프가 정상적으로 수행되기 위해서는
    • while의 조건식은 적어도 하나의 변수를 반드시 포함해야 한다.
    • 처음으로 while 명령어를 수행할 때 조건식에 포함된 변수는 while 명령어 이전에 미리 값을 할당받은 상태이어야 한다.
    • 조건식의 변수들 중에서 적어도 하나는 while과 end 사이의 명령어에서 새로운 값을 할당받아서 while 명령어의 조건식이 거짓이 되도록 만들어야 한다. 그렇지 않으면, 루프는 조건식을 거짓으로 만들수가 없으므로 무한 루프를 돌게 되어 루프를 빠져 나올 수 없게 된다.
  • while 루프의 적용 예

7장 MATLAB 프로그래밍

slide55

m=8;

while m ~= 0

m = m – 3;

end

m이 8, 5, 2, -1, … 과 같이 변하게 되어 정확히 0과 같은 값을 갖지 못하므로 조건식을 거짓으로 만들 수 없다. 따라서 무한 루프를 돌게 된다.

  • while 루프는 어떤 조건이 만족되는 동안 명령어 그룹을 반복 수행하고자 할 때 주로 사용된다. 일반적으로 while 루프를 for 루프로 수행할 수 있지만, 이런 경우에는 for 루프로 구현하기가 좀 더 까다로운 경우가 많다.

n=1;

while n ~= 5

disp(n)

n=n+1;

end

for n=1:4

disp(n)

end

while-end 루프 (3/3)

  • 무한 루프의 예 :

7장 MATLAB 프로그래밍

while for 1 2

EPS=1; n=0;

while 1+EPS > 1

EPS = EPS/2;

n = n + 1;

end

EPS = EPS*2

EPS=1;

for n=1 : 1000

EPS = EPS/2;

if (1+EPS)==1

EPS = EPS*2

break;

end

end

  • 프로그램이 무한 루프에 빠지게 된 경우, 키보드의 Ctrl + C또는 Ctrl + Break키 조합을 누름으로써 프로그램의 수행을 중지시킬 수 있다.
while 루프와 for 루프 (1/2)
  • eps()의 크기를 추정하는 프로그램

7장 MATLAB 프로그래밍

slide57

1부터 N까지의 정수의 합을 구하는 프로그램

N=100; sum = 0;

k = 1;

while k <= N

sum = sum + k;

k = k + 1;

end

sum

N=100; sum = 0;

for i = 1 : N

sum = sum + i;

end

sum

  • n! ≤ 100 을 만족하는 가장 큰 정수 n을 구하는 프로그램을 작성하라.

n=1;

while prod(1:n) < 100

n = n + 1;

end

n = n - 1

while 루프와 for 루프 (2/2)

7장 MATLAB 프로그래밍

7 7 taylor

x=input('x를 입력하시오 : ');

n=1; an=1; S=an;

while abs(an) >= 0.0001 & 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)

end

>> expox

x를 입력하시오 : 2

exp(2.000000) = 7.389046

사용된 항의 개수는 12 개이다.

>> expox

x를 입력하시오 : 21

30개보다 많은 항이 필요하다.

예제 7.7 함수의 Taylor 급수 표현

Taylor 급수를 이용하여 f(x)=ex =를 계산하는 스크립트 파일을 작성하라.

더할 항의 절대값이 0.0001보다 작으면 이 항을 무시하고 이전 항까지의 합을 구한다. while-end루프를 사용하되, 반복횟수는 30으로 제한한다. 30 번째 반복에서 더할 항이 0.0001보다 작아지지 않으면, 루프를 중지하고 30 개 이상의 항이 필요하다는 메시지를 출력하라. 이 프로그램을 이용하여 e2, e-4, e21을 계산하라.

7장 MATLAB 프로그래밍

slide59

for k=1:n

for h=1:m

……

……

end

……

end

…………

예)

for k=1:3

for h=1:4

명령어 그룹

end

end

중첩(된) 루프

루프

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

7장 MATLAB 프로그래밍

slide60

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

end

end

A

  • 첫째 루프의 인덱스 변수 k는 행의 주소이며, 둘째 루프의 인덱스 변수 h는 열의 주소이다.

>> Chap7_exp7

행의 개수를 입력하시오: 4

열의 개수를 입력하시오: 5

A =

1 2 3 4 5

2 4 7 11 16

3 7 14 25 41

4 11 25 50 91

예제 7.8 루프에 의한 행렬 생성
  • 다음 조건의 원소들을갖는 n×m 행렬을 생성하는 스크립트 파일을 작성하라. 첫째 행의 원소는 해당 원소가 속한 열의 번호와 같다. 첫째 열의 원소들은 해당 원소의 행의 번호와 같다. 나머지 원소들은 자기 바로 위의 원소와 자기 왼쪽 원소를 더한 값과 같다. n과 m의 값은 프로그램이 실행될 때입력되도록작성한다.

7장 MATLAB 프로그래밍

break continue
break와 continue
  • break명령어
    • break명령이 for와 while루프 안에 있으면, 루프의 실행을 즉시 중지하고 루프 밖의 다음 명령어로 넘어간다. 즉, break는 어떤 조건이 만족될 때 루프를 빠져나가기 위한 수단을 제공한다. 예) 루프의 횟수가 정해진 값을 초과하거나 수치계산에서 오차가 정해진 값보다 작아지면 루프를 종료한다.
    • break명령어가 중첩된 루프내에 있다면, break가 포함된 루프만 중지된다.
    • break명령어가 스크립트 파일이나 함수 파일에서 for루프나 while루프 밖에 있다면, 해당 위치에서스크립트 파일이나 함수 파일의 실행을 종료한다.

예) 함수 파일로 전달된 데이터가 원하는 것과 일치하지 않는 경우, break 명령어로 함수 파일의 실행을 중지시킨다.

  • continue명령어
    • continue 명령어가 for와 while의 루프 안에서 사용되면, 현재 수행중인 반복과정을 중지하고 루프의 다음 반복과정으로 넘어간다.
    • MATLAB이 continue 명령어를 만나게 되면, 루프의 나머지 명령들을 실행하지 않고 루프의 end명령어로 건너뛴 후, 다시 루프를 계속 반복한다.

7장 MATLAB 프로그래밍

loop break

사용자가 어떤 수를 입력하면, 1부터 그 수까지 센 후 다시 반복회수를 묻는 프로그램을 작성하라. 0을 입력하면 프로그램은 종료된다.

>> whileloop

반복 회수를 입력하시오( < 100) : 5

---------------------

번호 = 5

5번 반복하였습니다.

---------------------

반복 회수를 입력하시오( < 100) : 0

예제 loop와 break

while1

n = input('반복 회수를 입력하시오( < 100) : ');

ifn <= 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

end

fprintf('\n%d번 반복하였습니다.\n', n)

fprintf('---------------------\n\n')

end

7장 MATLAB 프로그래밍

7 9 1 3

한 퇴직자가 연리 5%의 저축계좌에 $300,000을 예금한다. 이 퇴직자가 1년에 1회씩 계좌에서 돈을 인출하려고 한다. 1년 후 $25,000 인출을 시작으로, 인플레이션 비율에 따라 인출금액을 증가시킨다. 인플레이션 비율이 예를 들어 3%라면, 2년 후에는 $25,750($25,000ⅹ1.03)을 인출한다. 인플레이션 비율이 매년 2%로 일정하다고 가정하여, 계좌의 예금이 유지되는 년수를 계산하라. 경과년수에 대한 매년 인출금액과 계좌잔고를 보여주는 그래프를 그려라.

  • 풀이

루프가 시작되기 전에 반복횟수가 알려져 있지 않으므로, while 루프를 이용한다. 루프를 반복할 때마다 인출할 금액과 계좌잔고가 계산된다. 계좌잔고가 인출할 금액보다 크거나 같은 한, 루프는 계속 반복된다.

1년 후

2년 후

3년 후

$292,950

$300,000

$315,000

$304,500

$25,000 인출

$25,500 인출

(25,000x1.02)

$26,010 인출

(25,500x1.02)

$266,940

$290,000

$279,000

예제 7.9 퇴직연금계정 인출 (1/3)

7장 MATLAB 프로그래밍

slide64

초기 설정,

1년 뒤 인출금액/잔고 계산

No

계좌잔고 > 인출금액

yes

인출금액 벡터 W 갱신

계좌잔고벡터 AB 갱신

ABnext

1년 후

2년 후

3년 후

$292,950

AB(1)=300,000

$315,000

$304,500

W(3)=25,500

W(2)=25,000

W(4)=26,010

1년 뒤 잔고 계산

1년 뒤 인출금액 계산

AB(4)=266,940

AB(2)=290,000

AB(3)=279,000

경과년 수 갱신

결과 및 그래프 출력

예제 7.9 (2/3)

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 프로그래밍

slide65

>> Chap7_exp9

year = 0 1

W = 0 25000

AB = 300000 290000

year = 0 1 2

W = 0 25000 25500

AB = 300000 290000 279000

year = 0 1 2 3

W = 0 25000 25500 26010

AB = 300000 290000 279000 266940

……..

계좌의 잔고는 15년 동안 유지된다.

예제 7.9 (3/3)

…….

fprintf('계좌의 잔고는 %d년 동안 유지된다.\n', year(n-1) )

bar(year, [AB' W'], 2.0)

파일명 : Chap7_exp9

7장 MATLAB 프로그래밍

7 10 1 3

복권 구입자는 숫자 목록에서 여러 개의 수를 선택해야 한다. 수 a와 b 사이에 균일하게 분포된 n개의 정수 리스트를 생성하는 사용자정의 함수를 작성하라. 생성된 리스트의 정수들은 모두 서로 달라야 한다.

a) 함수를 이용하여 1부터 49까지의 정수 중에서 6개의 정수 리스트를 생성하라.

b) 함수를 이용하여 60부터 75까지의 정수 중에서 8개의 정수 리스트를 생성하라.

c) 함수를 이용하여 -15부터 15까지의 정수 중에서 9개의 정수 리스트를 생성하라.

  • 풀이

수가 모두서로 다르게하나씩 선택한다. rand 함수로 수를 하나씩 선택하여 이미 정해진 수들과 비교하고같은 수가 있으면 선택한 수를 버리고 다시 새 수를 선택한다.

34

3

3

42

46

42

42와 같은 원소가 있는지 확인

3

42

42와 같은 원소가 있는지 확인

42와 같은 원소 42가 있으므로 추가하려던 42대신 다른 난수(34)를 다시 구한 후 다시3, 42, 46과 같은지 비교한다.

3

42

46

46과 같은 원소가 있는지 확인

예제 7.10 복권번호의 선택 (1/3)

7장 MATLAB 프로그래밍

slide67

while루프는 새로 x(p)에 추가할 정수가 이미 들어 있는(확정된) 원소와 다름을 확인하기 위해 for 루프에서 차례로 비교하여 혹시 일치하는 수가 있으면 끝까지 비교할 필요가 없으므로 break에 의해 for 루프를 빠져 나가 새로 x(p)를 할당한 후 다시 while 루프를 다시 시작한다.

예제 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);

r=0;

break

end

end

end

end

7장 MATLAB 프로그래밍

slide68

>> lotto(1,49,6)

ans =

3 42 46 34 37 20

>> lotto(60,75,8)

ans =

70 63 71 60 64 61 72 65

>> lotto(-15,15,9)

ans =

-11 -7 10 9 -8 13 -5 -9 3

예제 7.10 복권번호의 선택 (3/3)

7장 MATLAB 프로그래밍

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.11 로켓모델의 비행 (1/4)

7장 MATLAB 프로그래밍

slide70

구간 3 : 낙하산이 펴진 때부터 로켓이 땅에 닿을 때까지의 운동

이 구간에서는 로켓 속도가 -20 m/s로 일정하며, 로켓 높이가 0이 될 때까지이다.

예제 7.11 (2/4)

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 프로그래밍

slide71

예제 7.11 (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

n=n+1;

t(n)=t(n-1)+Dt;

v(n)=vChute;

h(n)=h2+vChute*(t(n)-t2);

end

subplot(1,2,1), plot(t,h,t2,h2,'o')

subplot(1,2,2), plot(t,v,t2,v2,'o')

7장 MATLAB 프로그래밍

slide72

결과의 정확도는 시간 증분 Dt의 크기에 따라 좌우된다. Dt=0.01초의 설정이 좋은 결과를 준 것으로 보인다.

  • while 명령어의 조건식은 n이 50,000보다 크면 루프를 멈추도록 n에 대한 조건도 포함하고 있는데, 이것은 루프 내의 명령문에 에러가 있을 경우 무한루프를 피하기 위한 예방책이다.
  • 이 문제는 여러 방법으로 프로그래밍할 수 있다. 예를 들어, 낙하산이 펴지는 시간과 로켓이 땅에 닿는 시간을 먼저 계산하여, while 루프 대신 for-end 루프를 사용할 수도 있다. 시간이 처음 결정되면, 루프 대신 원소별 계산을 이용할 수도 있다.

예제 7.11 (4/4)

7장 MATLAB 프로그래밍

7 12 1 3

반파 다이오드 정류기는 AC 전압을 DC 전압으로 변환한다. 전압원은 vs=v0 sin( t)이다.단, =2 f. 첫 사이클에서 다이오드는 t=0에서 t=tA까지 켜진상태(전류 통과)이다.t=tA에서 다이오드가 꺼지고 커패시터의 방전에 의해 저항에 전력이 공급된다.t=tB 에서 다이오드가 다시 켜지며 t=tD 까지 전류가통한다. 사이클은 전압원이 켜져 있는 한 계속된다. 다이오드가 켜지면, 저항의 전압과 전류, 커패시터의 전류는

저항기 양단 전압vR

vR=v0 sin(t), iR= v0 sin(t)/R, iC = Cv0 cos(t)

다이오드가 꺼지면, 저항기 양단의 전압은

전압원의 전압vs

다이오드가 꺼지는 시간tA, tD는iR=-iC 의 조건으로 구한다. 전원전압이 저항 양단의 전압에 도달하면 다이오드가 다시 켜진다. 시간 0≤t≤70 ms에 대한 저항 양단전압 vR과 전원 전압 vS의 그래프를 그리는 프로그램을 작성하라. R=1800 Ω, v0=12 V이고, f=60 Hz이다. C=45 μF과 C=10 μF에 대해 프로그램을 각각 실행하라.

예제 7.12 교류-직류 변환기 (1/3)

7장 MATLAB 프로그래밍

slide74

예제 7.12 (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

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 프로그래밍

slide75

C = 10 μF

C = 45 μF

예제 7.12 (3/3)

7장 MATLAB 프로그래밍

slide76

7장 끝

7장 강의록 끝

7장 MATLAB 프로그래밍