본문 바로가기

KNU_study/수치해석

수치해석(2) MATLAB 실습

728x90
반응형

 

 

1. MATLAB Fundamentals 

 

(1) Scalars

 

 

[1] 변수 이름은 문자로 시작해야 한다. 문자, 숫자나 밑줄(_) 기호를 포함 가능하다. [2] 세미콜론을 붙이면 주석 처리가 된다. 또한 저장해둔 변수를 report할 수 있다. [3] 복소수 변수는 i 또는 j를 사용하여 나타낼 수 있다. [4] format 명령을 사용하여 MATLAB에 여러가지 다른 형식으로 값을 보고하게 할 수 있다. short(5자리 고정), long(15자리 고정), short eng(5자리 이상의 숫자와 파워 있음) 

 

 

(2) Arrays, Vectors, and Matrices

매트랩은 데이터의 직사각형 배열을 자동으로 처리할 수 있다. 1차원 배열은 벡터, 2차원 배열은 행렬이다. [1] 매트랩은 대괄호 '[ ]'를 사용하여 배열을 해제한다. [2] 행 내의 항목은 공백 또는 쉼표로 구분된다. [3] 행은 세미콜론으로 구분된다. 

 

 

데이터의 2-D 배열 또는 행렬은 행 단위로 입력되며, 행 내에서 공백(또는 쉼표)이 항목을 구분하고, 세미콜론이 행을 구분한다. 

 

 

유용한 Array 명령어 중 transpose operator를 사용하여 배열을 대각선 위로 뒤집을 수 있다. 예를 들어 b가 만약 행 벡터라면, b'는 (b의 복소수 켤레를 포함하는) 열 벡터이다. 또한 who 명령은 사용된 변수 이름을 다시 보고한다. 

 

 

array 내 개별 항목은 위치 인덱스 또는 행과 열을 사용하여 읽고 설정할 수 있다. 인덱스 값은 배열의 왼쪽 상단 모서리에 있는 항목에 대해 1로 시작, 즉 1행 1열로 시작하여 열 아래로 증가한다. C언어에서 array [3][4]는 4행 5열을 의미하지만, 매트랩에서 array [3][4]는 3행 4열을 의미한다. 인덱스 순서는 아래와 같이 진행된다. 

 

 

array를 생성하는 데는 다음과 같은 built in 기능이 내장되어 있다. 

 

zeros(r, c) 0으로 가득 찬 r행 c열을 생성한다.
zeros(n) 0으로 가득 찬 n by n 행렬을 생성한다. 
ones(r, c) 1로 가득 찬 r행 c열을 생성한다. 
ones(n) 1로 가득 찬 n by n 행렬을 생성한다. 
help elmat 기본 행렬, 배열 정보, 행렬 조작 등을 제공한다. 

 

array 생성 시 colon operator ':'는 여러 맥락에서 유용하다. 표기법을 사용하여 점들의 선형 간격 배열을 만드는 데 사용할 수 있다. start : diffval : limit의 문법으로 구성되며 start는 배열의 첫 번째 값이고, diffval은 배열의 연속적인 값 사이의 차이며, limit는 마지막 값의 경계이다.

[1] 만약 diffval을 빠뜨렸다면, 디폴트 값인 '1'의 간격으로 결과가 나온다. [2] 감소하는 결과를 원한다면 diffval을 음수로 지정하면 된다. [3] 증가하는 경우 start + diffval > limit라면, 혹은 감소하는 경우 start + diffval < limit라면, 빈 행렬이 반환된다. [4] 열을 만들려면, limit 값에만 전치를 취하는 것이 아니라 입력 전체에 전치를 취한다. 3:6' 이 아니라 (3:6)' 이 맞다. 

 

 

array 생성 시 linspace 명령은 두 숫자 사이의 특정 개수의 선형 간격 점을 갖는 행 벡터를 만들어준다. linspace(x1, x2, n)는 x1과 x2 사이에 n개의 점으로 이루어진 선형 이격 배열을 만든다. n을 생략하면, 100개의 점을 생성한다. 열을 생성하기 위해선 linspace의 출력을 전치하면 된다. 

 

 

array 생성 시 logspace 명령은 두 숫자 사이의, 특정한 대수적으로 이격된 점 수를 갖는 행 벡터를 만들어준다. 이게 무슨 소리냐.. logspace(x1, x2, n)은 10x1과 10x2 사이의 n개의 점으로 이루어진 대수적으로 이격된 배열을 만든다. 역시 n을 생략하면 100개의 점이 생성되고, 열을 생성하기 위해선 linspace의 출력을 전치하면 된다. 

 

 

(3) Character Functions

[1] 영숫자 상수는 아포스트로피 ' 로 둘러싸여 있다. [2] 문자열 합치기가 가능하다. [3] 긴 줄을 이어갈 때는 Ellipsis(...)을 사용한다. [4] 문자열에서 Ellipsis(...)를 사용하면 생략과 이어감은 불가능하지만 분할이 가능하다. 

 

Function Description
n = length(s) 문자열 s의 개수
b = strcmp(s1, s2) 문자열 s1, s2가 동일한 지 비교한다. 
n = str2num(s) 문자열 s를 숫자 n으로 변환한다. 
s = num2str(n)  숫자 n을 문자열 s로 변환한다. 
s2 = strrep(s1, c1, c2)  문자열 안의 character를 다른 character로 변환한다. 
i = strfind(s1, s2) 문자열 s1에서 문자열 s2가 발생할 경우 시작 인덱스 반환.
S = upper(s) 문자열을 대문자로 반환한다. 
s = lower(s) 문자열을 소문자로 반환한다. 

 

(4) Mathematical Operations

매트랩의 수학적 연산은 스칼라, array 모두에서 수행할 수 있다. 

 

^ Exponentiation 4 ^ 2 = 16
- Negation(unary operation) -8 = -8
*, / Multiplication and Divison 2 * pi = 6.2832, pi/4 = 0.7854
\ Left Divison 6 \ 2 = 0.3333
+, - Addition and Subtraction 3 + 5 = 8, 3 -5 = -2

 

(5) Complex Numbers

위의 모든 연산은 복잡한 양(즉 i  또는 j를 이용하여 입력하고, i를 이용하여 표시하는 허수 부분 포함한 값들)과 함께 사용할 수 있다. 

 

 

(6) Plotting Options

아래 Plotting 예제들을 따라하며~ 매트랩 공부를 해보자. (오류는 눈 감아주자)

 

 

데이터를 플롯할 때 여러 가지 색상, 점 스타일 및 선 스타일을 사용할 수 있다. 이들은 플롯 지정자를 사용하여 플롯 명령의 끝에 지정된다. [1] 만약 'ro'라면 점에 원이 있는 빨간색 점선이, [2] 'gd'라면 선이 없는 점의 녹색 다이아몬드가, [3] 'm--'이면 점 기호가 없는 마젠타 점선일 것이다. 

 

 

플롯 관련 추가적인 명령어들을 설명하겠다. [1] hold on은 매트랩에게 현재 데이터를 플롯한 상태로 유지하고, 추가 플롯 명령의 결과를 그래프에 추가하도록 지시한다. 시리즈의 첫 번째 플롯을 만든 후에 사용해야 한다. [2] hold off 명령 전까지 [1]의 명령은 진행된다. [3] subplot(m, n, p)는 그림 창을 작은 축의 mxn 배열로 분할하고 p번째 축을 활성화한다. 첫 번째 subplot이 왼쪽 상단에 있고, 그런 다음 번호가 행 전체에 걸쳐 계속 표시된다. 

 

(7) 그 외 다양한 것들 

Vector-Matrix Calculations : 벡터와 행렬에 대한 연산도 수행할 수 있다. [1] 첫 번째 행렬의 열 수는 두 번째 행렬의 행 수와 일치해야 한다. [2] 행렬의 ^연산자는 행렬에 지정된 횟수만큼 곱해지는 결과를 가져온다. 이 경우 행렬은 정사각형이어야 한다. 

Element-by-Element Calculations : 벡터와 행렬에서 항목별로 계산을 수행할 때, 어레이 작업(array operations)을 호출한다. 이러한 작업을 요소별 작업이라고도 한다. [1] 매트랩은 배열 곱셈 및 배열 분할 연산자로 .* 및 ./를 정의한다. [2] 배열 작업의 경우 두 행렬의 크기가 동일하거나, 두 행렬 중 하나가 1x1이어야 한다. [3] 배열 지수화는 .^로 수행된다. 각 원소를 지수화하면 된다. 

Built-In functions : 데이터를 생성하고 조작하는 데 사용할 수 있는 몇 가지 기본 기능이 있다. [1] built-in help 함수는 존재하는 기능과 해당 기능의 사용 방법에 대한 정보를 제공한다. help elmat는 행렬에 대한 정보를 얻기 위한 함수를 포함하여 기본 행렬 생성 및 조작 함수를 나열한다. help elfun은 trig, 지수, 복소수, 반올림 그리고 나머지 함수를 포함한 기초 수학 함수들을 나열한다. [2] 내장된 look for 명령어는 도움말 파일에서 텍스트가 발생하는지 검색하며 기능의 목적은 알고 있지만, 이름은 모르는 경우 유용할 수 있다. 

Graphics : 매트랩에는 강력한 그래픽 기능이 내장되어 있다. [1] 2개의 기본함수는 plot(2D 데이터 표시), plot3(3D 데이터 표시)이다. [2] 플롯 명령 외에도 제목, xlabel, ylabel 및 범례 명령을 사용하여 그래프에 레이블을 지정하고 주석을 달 수 있다. 

 

 

2. Programming with MATLAB

 

(1) M-Files

명령 창에 직접 명령을 입력하는 방법 외에도 M-file이라는 텍스트 파일에 명령을 넣을 수 있다. M-file은 .m 확장자로 저장되기 때문에 이렇게 이름이 붙여진다. 크게 두 가지 종류가 있는데, [1] Script files는 단순히 매트랩 명령어의 집합이며 명령 창에 .m을 제외한 파일 이름을 입력하거나 편집 창에서 Run 또는 F5 키를 눌러 실행할 수 있다. [2] Function files는 입력 인수(input arguments)를 허용하고, 명령창에 출력을 반환한다. 또한 해당 함수 내에서 생성 및 조작되는 변수는 명령 창에 영향을 주진 않는다. Function file의 문법을 알아보자. 일반적인 함수의 문법은 아래와 같다. 

 

function outvar = funcname(arglist)
%helpcomments
statements
outvar=value;
outvar 출력 변수의 이름
funcname 함수의 이름
arglist 입력 인수 목록, 
helpcomments 설명문 주석
statements 함수의 매트랩 명령

 

Function M-file은 한 개 이상의 결과를 출력할 수 있다. 

 

 

Function file은 하나의 함수를 포함할 수 있지만, 또한 하나의 함수를 더 포함할 수도 있다. 주요 함수는 M-file에서 가장 먼저 나열된 함수이다. 물론 주요 함수의 이름은 파일 이름과 같아야 한다. Subfunctions는 주요 함수 아래에 나열된다. 이들은 동일한 M-file 내의 주요 함수 혹은 Subfunctions에 의해서만 액세스할 수 있으며, 명령 창에선 액세스할 수 없다. 

 

 

(2) Input and Output

[1] Input은 사용자로부터 값을 얻는 가장 쉬운 방법으로, n = input('promptstring') 의 명령이다. 매트랩은 명령 창에 'promptstring'을 표시하고, 입력된 값은 n에 저장된다. 예를 들어 pi를 입력하면 n = 3.1416...이 된다. n = input('promptstring', 's') 의 명령은 명령 창에 'promptstring'을 표시하고, 입력된 문자열을 n에 저장한다. 예를 들어 pi를 입력하면 n은 'p'와 'i'를 2x1 문자 배열로 저장한다. [2] Output은 행렬의 값을 표시하는 가장 쉬운 방법으로, disp(value) 의 명령이다. 만약 값이 문자열이면 작은 따옴표로 묶여 출력된다. 

 

 

Formatted output, 즉 형식이 지정된 출력의 경우 fprintf('format', x, y, ...) 의 명령을 사용한다. 여기서 'format'은 변수 x, y 등의 값을 표시하는 방법을 지정한다. 또한 값과 함께 인쇄할 문자 텍스트를 포함한다. 변수의 값은 format code에 따라 형식이 지정된다. 

 

%d interger format
%e scientific format with lowercase e
%E scientific format with uppercase E
%f decimal format
%g the more compact of %e or %f

 

\n start a new line
\t tab
\\ print the \ character

 

 

(3) Creating and Accessing Files

매트랩에는 값을 변수에 저장하고, 로드하는 데 사용할 수 있는 파일 형식이 내장되어 있다. [1] save filename var1 var2 ... varn 는 filenamve.mat라는 이름의 파일에 변수를 입력한다. 변수가 나열되지 않았다면, 모든 변수가 저장될 것이다. [2] load filename var1 var2 ... varn 는 filename.mat이라는 파일에서 나열된 변수를 로드한다. 변수가 나열되지 않았다면, 모든 변수가 로드될 것이다. 이들은 모두 텍스트 파일이 아니다.

 

왜 하라는 것과 내 실행 화면이 다른진 모르겠지만.. 그렇다..

 

(4) ASCII files, Operators

사용자가 읽을 수 있는 파일을 생성하기 위해선, -ascii 플래그를 저장 명령 끝에 달아야 한다. 이것은 disp 명령어와 동일하게, 데이터를 txt파일에 저장할0 것이다. 이러한 경우, 매트랩은 파일 이름에 아무것도 추가하지 않으므로 txt 혹은 dat 파일과 같은 확장을 추가할 수 있다. 또한 텍스트 파일에서 직사각형 배열을 로드하려면 load 명령어와 파일 이름을 사용하면 된다. 

-> 나중에 복습 다시 하기

 

아래는 우리가 몹시 잘 아는 Operator들이다. 이들은 우선순위가 있긴 하지만, 괄호를 이용하여 우선순위를 설정할 수 있다. 물론 기본 순위는 수학식, 관계형 연산자, 논리형 연산자 순서다. 논리형 연산자 중에선 Not, And, Or 순서로 순위가 이어진다. 예를 들어 x=5가 3보다 크고 4보다 작은 것을 비교할 때 3<x<4라고 비교하지 말고, (3<x)&(x<4)를 사용하여 적절하게 평가하자. 

 

Example Operator Relationship
x == 0 == Equal
unit ~= 'm' ~= Not equal
a < 0 < Less than
s > t > Greater than
3.9 <= a/3 <= Less than or equal to
r >= 0 >= Greater than or equatl to

 

Example Operator Relationship
~A ~ true if A is false, false otherwise
A & B & true if borh A and B are true
(or non-zero)
A | B | true if either A or B are true
(or non-zero)

 

 

(5) Programming structure

매트랩은 구조화된 프로그래밍을 통해 프로그램의 조건에 따라 결정 및 선택을 할 수 있다. if문과 switch문을 배워보자. [1] Decision은 if 구조를 사용하여 매트랩에서 내려지는데 if 구조에는 여러 개의 elseif문과 else가 포함된다. 이러한 분기 실행은 참 또는 거짓인 조건의 결과에 따라 결정된다. 참고로 조건이 행렬인 경우, 모든 항목이 참(또는 0이 아닌)인 경우에만 참으로 간주한다. [2] Selection은 선택을 수행하며 otherwise 선택을 포함한다. test expression이 스위치문의 연결된 값과 일치하면 해당 스위치의 분기가 실행된다. 

 

 

또 다른 프로그래밍 구조는 동일한 라인의 코드가 여러 번 실행되는 Loops를 포함한다. 루프에는 두가지 유형이 있는데 [1] for loop는 인덱스 변수에 주어진 열의 개수로 설정된, 지정된 반복 횟수 후에 끝난다. 문법은 for index = start:step:finish \n statements \n end, 총 3줄이다. 

 

for Loops

 

[2] while loop는 논리적 조건에 따라 종료된다. 관련 문법을 하기 전, 때로는 요소별로 배열 요소를 처리하기 보다 매트랩이 전체 배열에 대한 계산을 수행하도록 하는 것이 더 효율적일 수 있다. 즉, Vectorization하자. 

 

for loop Vectorization
i = 0;
for t = 0:0.02:50
   i = i + 1;
   y(i) = cos(t);
end
t = 0:0.02:50;
y = cos(t);

 

위엔 그냥 참고 사항이고, While loop는 불확정한 횟수만큼 실행되므로 for loop와는 근본적으로 다르다. 문법은 while condition \n statements \n end, 총 3줄이며 여기서의 조건은 논리식이다. 조건이 참이면 문들이 실행되고, 그것이 끝나면 루프는 다시 조건을 확인한다. 

빠른 종료도 가능하다. 때때로 for문 또는 while 루프를 중지하는 것이 유용할 수 있다. [1] 일반적으로 if 구조와 함께 중단문을 사용할 수 있다. 루프를 조기에 끊을 수 있다. [2] 프로그램이 일시중지되길 원할 때 pause 명령을 사용하자. 절차를 중단시키고, key가 칠 때 까지 기다린다. 아래는 각각의 예시들이다. 

 

x = 24
while(1)
	x = x - 5
    if x < 0, break, end
 end

 

for n = 3:10
	mesh(magic(n))
    pause
end

 

(6) Animation

매트랩에서 플롯을 애니메이션화하는 두 가지 방법이 있다. [1] 단순 플롯 함수와 함께 루프을 사용한다. 그래프를 반복해서 교체하는 것 뿐인 방법이다. 그림의 척도를 고정하려면, 축 명령을 사용하는 것이 중요하다. [2] 특수 기능인 getframe 혹은 movie를 사용한다. 이렇게 하면 일련의 플롯을 캡처(getframe)한 다음, 재생(movie)할 수 있다. 

 

오 ~~ 움직임

 

# 이건 비디오 파일 저장 코드

clc,clf,clear
v = VideoWriter('testvideo.avi');
open(v);
g=9.81; theta0=45*pi/180; v0=5;
t(1)=0;x=0;y=0;
plot(x,y,'o','MarkerFaceColor','b','MarkerSize',8)
axis([0 3 0 0.8])
M(1)=getframe;
dt=1/128;
for j = 2:1000
t(j)=t(j-1)+dt;
x=v0*cos(theta0)*t(j);
y=v0*sin(theta0)*t(j)-0.5*g*t(j)^2;
plot(x,y,'o','MarkerFaceColor','b','MarkerSize',8)
axis([0 3 0 0.8])
M(j)=getframe;
if y<=0, break, end
end
pause
movie(M,1)
writeVideo(v,M)
close(v)

 

(7) Anonymous & Inline Functions

[1] Anonymous function은 M파일이 필요 없이 만들어진, 단순한 한 줄 함수다. 문법은 fhandle = @ (arg1, arg2, ...) expression이다. [2] Inline function은 기본적으로 [1]과 동일하지만 문법이 다르다. fhandle = inline('expresssion', 'arg1', 'arg2', ...)이다. [1]을 생성 시 작업 공간의 변수 값에 액세스할 수 있지만, [2]는 액세스할 수 없다. 

 

Anonymous function

 

Inline function
Inline function의 특징 : 인자 값을 수정해도, 반영되지 않는다.

 

Anonymous & Inline fuctions : 인자 값을 수정하면, 반영되는 Inline 함수다.

 

(8) Function functions

Function funtions는 입력 인수로 전달되는 다른 함수에서 작동하는 함수다. 입력 인수는 익명 or 인라인 함수의 핸들, or 내장 함수의 이름 or M-file 함수의 이름일 수 있다. 이 함수를 사용하면 보다 동적인 프로그래밍이 가능하다. 

 

 

 

 

728x90
반응형