제 1 장 matlab 둘러기 -...
TRANSCRIPT
-
제 1 장
MATLAB 둘러보기
-
• MATLAB: MATrix LABoratory
• 대화 형식 프로그래밍 환경: 제 4세대 언어
MATLAB 시작하기
• MATLAB 데스크탑 window:
-
• MATLAB의 수행: Command Window에서 명령어를 입력
• Command Window: Desktop→Desktop Layout→Command Window Only
• 기본 상태: Desktop→Desktop Layout→Default
-
Command Window에서의 입력
• Command Window 위에서 마우스를 클릭하여 이를 활성화
• 프롬프트(>>)에서 명령어 입력을 시작
• 보기: a = [1 2 3]라고 타이프하고 Enter:
>> a = [1 2 3] a = 1 2 3
• ”a ="와 “1 2 3”이 빈 줄로 분리
• format compact: 스크린 상의 빈 줄들로 이루어지는 공간을 생략
• 보기: 2+2, factor(123456789), sin(100)을 시도
-
Command Window에서 명령어를 입력할 때 유의해야 할 사항:
• 대문자와 소문자는 다르다.
• 변수의 이름을 타이프하면 현재값을 스크린에 제시
• 마지막 부분에 세미콜론(;)을 두면 변수값이 스크린에 나타나지 않는다.
• (), [], 그리고 {} 들은 서로 교환될 수 없다.
• 위쪽 화살표와 아래쪽 화살표 키를 이용하여 이전에 입력한 명령문들을 순차적으로 검색
• 첫 번째 몇 글자를 타이프하고 위쪽 화살표 키를 누르면 예전의 명령어를 다시 불러올 수
있다.
• help (주제명)을 입력하면 명령어, 함수, 혹은 관심있는 주제에 대한 도움말에 접할 수 있다.
• MATLAB을 끝내려면 exit나 quit를 입력
-
Help(도움말)의 이용
• ommand Window에서 help는 특정 명령어에 대한 신속한 정보를 얻는 데에 유용
• MATLAB 도움말 검색기를 이용하면 보다 광범위한 내용을 얻을 수 있다.
• 창 상단의 메뉴 바에서 Help를 클릭하면 도움말 검색을 위한 다양한 옵션들을 제공
• Help를 클릭하고 이로부터 나타나는 부메뉴에서 MATLAB Help를 클릭하면 Help Navigator
창이 나타난다.
• 도움말 검색방법: 메뉴 바에서 Help를 클릭하고 이로부터 나타나는 부메뉴에서 Using the
Help Browser를 선택
MATLAB 작업 중지하기
• 프롬프트에서 quit를 입력
• 일반적으로 창을 닫아주는 버튼(대개 상부 오른쪽 구석에 있는 X)을 클릭
• File 메뉴에서 Exit MATLAB을 선택
-
연산과 변수의 할당
• +: 더하기, -: 빼기, *: 곱하기, /: 나누기, ^: 멱급수 연산
• 보기: >> 5^3 - (6 + 2)/2 + 7*4 ans = 1 4 9
• 보기: 와 을 계산
>> (1+sqrt(5))/2 ans = 1.6180 >> 2^(-53) ans = 1.1102e-016
• 연산 결과: ans라고 불리는 변수에 할당 • 이를 이용하여 다른 계산을 수행하려면 변수 ans를 사용 • 보기: 이전 답의 제곱과 제곱근의 합
>> ans^2 + sqrt(ans) ans = 2.2213e+004
-
• 어떤 변수에 값을 할당: 등호(=)를 사용 • 보기:
>> u = cos(20) u = 0.4081 >> v = sin(20) v = 0.9129 >> u^2 + v^2 ans = 1
• 삼각함수의 계산: 라디안을 사용 • pi: 값을 갖는 항구적인 변수
>> y = tan(pi/8) y = 0.4142
-
• 기본적인 산술 연산자:
연산자 기능 연산자 기능
+ 더하기 .^ 배열의 거듭제곱
- 빼기 ∖ 백슬래쉬, 행렬의 왼 나눗셈
* 곱셈 / 슬래쉬, 오른 나눗셈
.* 배열의 곱셈 .∖ 배열의 왼 나눗셈
^ 거듭제곱 ./ 배열의 오른 나눗셈
-
•복소수
• 허수단위 의 표현: I, j, sqrt(-l), complex(0,1)
• 보기: 실수부가 2, 허수부가 -3인 복소수는 2-3i, 2-3*i, 2-3*sqrt(-1), 혹은 complex(2,-3)과
같이 표현
• conj: 켤레복소수, real: 실수부, imag: 허수부
• 복소수의 크기: abs, 위상각: angle을 이용
• 보기: >> w = (-1)^0.25 w = 0.7071 + 0.7071i >> z = conj(w) z = 0.7071 - 0.7071i >> [real(z) imag(z)] ans = 0.7071 -0.7071 >> exp(i*pi) ans = -1.0000 + 0.0000i >> angle(w) ans = 0.7854 >> abs(w) ans = 1
-
•입력 오류의 수정
• 에러 메시지의 보기:
>> 4x^3 ??? 4x^3 | Error: Missing MATLAB operator.
• 오류의 수정: 상향 화살표( ) 키와 왼쪽 및 오른쪽 화살표 키들을 이용하여 명령어들을
편집한 다음 Return이나 Enter 키를 눌러 다시 수행
•계산의 중지
• 계산에서 빠져나오지 못하거나 연산에 너무 오랜 시간이 걸리는 경우: Ctrl+C
-
벡터와 행렬
• 벡터
• 벡터: 순서로 나열된 수들의 목록 • 대괄호 안에 수들을 콤마나 빈 칸으로 구분시켜 넣음으로써 벡터를 입력 • 보기:
>> u = [-3 2 4 8 11] u = -3 2 4 8 11 >> u = [-3,2,4,8,11] u = -3 2 4 8 11 >> v = [-5 3 -7 9 12 -1 0 6] v = -5 3 -7 9 12 -1 0 6
• 보기: 1에서 10까지의 값을 갖는 벡터를 생성
>> w = 1:10 w = 1 2 3 4 5 6 7 8 9 10
• 증가분은 0:0.1:2이나 100:-2:0과 같이 소수이거나 음수일 수 있다. • 일반적으로 m:n은 원소가 m, m+1, ..., n 인 벡터를 생성
-
• 증가분이 1이 아닌 경우는 m:s:n으로 지정: m으로 시작하여 s만큼 증가(혹은 감소)하면서 n에 이르는 원소들이 생성 • 보기:
>> g = 2:3:10, h = 1:-0.25:0 g = 2 5 8 h = 1.0000 0.7500 0.5000 0.2500 0
• 벡터 w의 원소: w(1), w(2) 등과 같이 취할 수 있다 >> w(3) ans = 5
• 벡터 w에서 세 번째부터 6번째 원소까지로 구 성되는 새로운 벡터 v: >> v = w(3:6) v = 3 4 5 6
-
• 벡터 w를 행벡터로부터 열벡터로 전환: w 다음에 프라임(‘)을 붙인다: >> w' ans = 1 3 5 7 9 • 벡터 X의 각 원소들에 대한 제곱: >> X = 0:2:10 X = 0 2 4 6 8 10 >> X.^2 Ans =
0 4 16 36 64 100
• 마침표(.): X 안의 숫자들이 개별적으로, 혹은 원소별로 제곱
• 벡터들을 원소별로 곱하거나 나눌 경우: .*이나 ./를 이용
-
• 보기: 벡터 a의 원소들을 벡터 b의 원소들과 곱하기
>> a = 1:2:10 a = 1 3 5 7 9 >> b = [-2 3 -5 1 6] b = -2 3 -5 1 6 >> a.*b ans = -2 9 -25 7 54
•linspace
• linspace(a,b,n): a와 b 사이에 간격이 동일한 n 개의 점들을 생성 • n을 생략하면 n = 100으로 설정
>> linspace(-1,1,9) ans = -1.0000 -0.7500 -0.5000 -0.2500 0 0.2500 0.5000 0.7500 1.0000
-
• 벡터의 각 원소에 대한 계산
• exp(a): 행 벡터 a의 각 원소에 대한 지수값을 계산
• log(ans): ans 에 저장된 각 원소에 대한 로그값을 계산
• sqrt(a): 벡터 a의 각 원소에 대한 제곱근 값을 계산
>> a = [1 2 3]; >> exp(a) ans = 2.7183 7.3891 20.0855 >> log(ans) ans = 1 2 3 >> sqrt(a) ans = 1.0000 1.4142 1.7321
-
• 벡터의 내적(inner product)과 외적(outer product)
• 내적, 스칼라, 혹은 점 곱: x'*y, dot(x,y)
• 외적: cross
>> x = [-1 0 1]'; y = [3 4 5]'; >> x'*y ans = 2 >> dot(x,y) ans = 2 >> cross(x,y) ans = -4 8 -4 >> Z = x*y' Z = -3 -4 -5 0 0 0 3 4 5
-
•행렬
>> A = [1 2 3 4; 5 6 7 8; 9 10 11 12] A = 1 2 3 4 5 6 7 8 9 10 11 12
• 각 행들은 세미콜론으로 구분 • A+c: 스칼라 c를 A의 각 원소에 더함 • A-B: A와 B의 차이 • A-c: A의 각 원소로부터 숫자 c를 뺌 • A와 B의 곱: A*B • 숫자 c와 행렬 A의 곱: c*A • A': A의 공액 전치 • 예: 행렬 A와 열벡터 x의 행렬 곱
• 3 x 4 행렬의 보기:
>> x = [3 -2 5 4]' x = 3 -2 5 4 >> A*x ans = 30 70 110
-
• 두 행렬 A와 B의 합, 차이, 곱:
» A = [2 1 3; -1 0 1; 4 2 6] A = 2 1 3 -1 0 1 4 2 6 » B = [1 0 2;3 -2 1;-1 1 2] B = 1 0 2 3 -2 1 -1 1 2 » C = A+B C = 3 1 5 2 -2 2 3 3 8 » D = A-B D = 1 1 1 -4 2 0 5 1 4 >> P = A*B P = 2 1 11 -2 1 0 4 2 22
-
• sum 함수: 각 열의 합
>> sum(A) ans = 5 3 10
• diag: 주어진 행렬의 대각원소
>> diag(A) ans = 2 0 6 >> sum(diag(A)) ans = 8
• W^2 : 행렬곱 W*W • W.^2 : W의 모든 원소들이 각각 제곱
>> W = [1 2; 3 4] W = 1 2 3 4 >> W^2 ans = 7 10 15 22
-
>> W.^2 ans = 1 4 9 16 >> x = [1 2 3]; y = [2 3 4]; z = [1 2; 3 4]; >> x.^y ans = 1 8 81 >> 2.^x ans = 2 4 8 >> 2.^z ans = 2 4 8 16
• A' : 행렬 A의 켤레 전치 • A가 실수이면 A'는 단순한 전치 • A.' : 켤레화되지 않은 전치
>> Z = [1 -i;1+2i 1+i] Z = 1.0000 0 - 1.0000i 1.0000 + 2.0000i 1.0000 + 1.0000i >> Z' ans = 1.0000 1.0000 - 2.0000i 0 + 1.0000i 1.0000 - 1.0000i
>> Z.' ans = 1.0000 1.0000 + 2.0000i 0 - 1.0000i 1.0000 + 1.0000i
-
• 행렬의 계수(係數, rank): rank • 행렬값: det • 역행렬: inv
>> B = [1 0 2;3 -2 1;-1 1 2] B = 1 0 2 3 -2 1 -1 1 2 >> rank(B) ans = 3 >> det(B) ans = -3 >> inv(B) ans = 1.6667 -0.6667 -1.3333 2.3333 -1.3333 -1.6667 -0.3333 0.3333 0.6667 >> B^-1 ans = 1.6667 -0.6667 -1.3333 2.3333 -1.3333 -1.6667 -0.3333 0.3333 0.6667
-
•행렬 B의 2행 3열에 위치하는 원소: B(2,3), 두 번째 열: B(:,2), 세 번째 행: B(3,:)
>> B(2,3) ans = 1 >> B(:,2) ans = 0 -2 1 >> B(3,:) ans = -1 1 2
B에서 2열과 3열만을 취하여 새로운 행렬 C를 만든다면
>> C = B(:,2:3) C = 0 2 -2 1 1 2
-
• 자동구성 행렬: eye, zeros, ones들을 이용
>> I3 = eye(3,3), Y = zeros(3,5), Z = ones(2) I3 = 1 0 0 0 1 0 0 0 1 Y = 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 Z = 1 1 1 1
• 불규칙 수들로 구성되는 행렬: rand와 randn
• rand: [0,1] 상에서 균일 분포를 갖는 불규칙 원소들을 생성
• randn: 정규 (0,1) 분포를 갖는 불규칙 원소들을 생성
>> F = rand(3), G = randn(1,5) F = 0.7062 0.3586 0.8468 0.5260 0.8488 0.3270 0.2157 0.0426 0.5541 G = 1.4051 1.1780 -1.1142 0.2474 -0.8169
-
출력의 억제
• 입력라인 끝부분 스크린의 세미콜론(;) : MATLAB 명령어의 출력이 프린트되는 것이 억제
>> A = [1 2 3 4; 5 6 7 8; 9 10 11 12]; >> A*x;
데이터의 표현
• 데이터 출력형식: format 명령어를 이용
>> format long >> a = [1 2 3]; >> sqrt(a) ans = 1.00000000000000 1.41421356237310 1.73205080756888 >> format short >> sqrt(a) ans = 1.0000 1.4142 1.7321
-
• 다양한 format 명령어 및 옵션:
명령어+옵션 기 능 보기
format 기본. short와 동일.
format bank 달러와 센트의 고정서식 2.23
format compa
ct
여분의 라인을 생략 theta = pi/2
theta =
1.5708
format hex 16진수 40092fb54442d18
format long 15자리로 조정된 고정소수점 3.14159265358979
format long e 15자리 부동소수점 3.141592653589793e+0
0
format long g 15자리 고정소수점 또는 부동소수
점의 최적합표시
3.14159265358979
format short 5자리로 조정된 고정소수점 3.1416
format short e 5자리 부동소수점 3.1416e+00
format short g 5자리 고정소수점 또는 부동소수
점의 최적합표시
3.1416
format rat 유리수 분수형식 355/113
-
• vpa: 변수 정밀도 연산을 수행
>> vpa('sqrt(2)', 50) ans = 1.4142135623730950488016887242096980785696718753769
• lookfor 명령어: 지정한 키워드가 포함되는 함수, 명령어를 추출하여 해당하는 함수
및 명령어 이름을 모두 제시
• 소수점 이하의 취급:
함수 설명 기능
round 가장 가까운 정수로의 포함 사사오입
ceil +방향으로의 포함 올림
floor -방향으로의 포함 내림
fix 0을 향한 가장 가까운 정수로의 포함 내림(+의 경우) 올림(-의 경우)
>> round((100*3+150*3)*0.05) ans = 38
-
변수의 처리
•clear 명령어 • 함수 이름과 변수 이름이 같을 때에는 변수이름이 우선 • clear: 변수를 모두 소거 • 개별적인 변수의 소거: clear 다음에 소거하고자 하는 변수 이름을 입력
>> clear x
• clear 명령어의 옵션:
clear 명령어의 옵션 기능
clear 작업공간에서 모든 변수를 소거
clear variables 작업공간에서 모든 변수를 소거
clear global 모든 광역 변수를 소거
clear functions 모든 컴파일 된 m파일, mex 파일로의 링크를 소거
clear all 모든 변수, 광역 변수, 함수, MEX 링크, Java 패키지
임포트 리스트를 소거
clear import
명령어 프롬프트로 Java 패키지 임포트 리스트를 소
거
단, 함수 안에서는 사용 불가
clear classes 클래스의 정의도 소거
-
•특수변수와 정수
특수변수와 정수 기능
ans 최신 출력
eps 부동소수점에서의 상대정밀도(= )
realmax + 최대부동소수점 개수
realmin + 최소부동소수점 개수
pi 3.1415926535897
i, j 허수단위
inf 무한대
NaN 부정치
-
• whos 명령어
• Command Window에서 변수를 확인
>> whos Name Size Bytes Class A 3x3 72 double array B 3x3 72 double array X 1x6 48 double array Z 3x3 72 double array a 1x3 24 double array ans 1x3 24 double array b 3x1 24 double array u 1x5 40 double array v 1x8 64 double array w 1x5 40 double array x 3x1 24 double array y 1x1 8 double array Grand total is 64 elements using 512 bytes
-
기호를 이용한 연산 • Symbolic Toolbox(기호 툴박스)를 이용 • syms를 사용하여 기호변수로 사용하고자 하는 변수들을 선언
>> syms y >> a = 7; >> a^2 - 2*a*y + y ans = 49-13*y >> syms x y >> z = x^2 - 2*x*y + y z = x^2-2*x*y+y >> 5*y*z ans = 5*y*(x^2-2*x*y+y) >> syms x y >> (x - y)*(x - y)^2 ans = (x-y)^3 >> expand(ans) ans = x^3-3*x^2*y+3*x*y^2-y^3 >> factor(ans) ans = (x-y)^3
-
• expand: 식의 곱셈
• factor: 식을 인수분해
• simplify: 식을 가능한 한 간단하게 표현
>> simplify((x^3 - y^3)/(x-y))
ans =
x^2+x*y+y^2
>> syms p x y
>> y = ((x^p)^(p+1))/x^(p-1);
>> simplify(y)
ans =
(x^p)^p*x
-
•기호식에서의 치환
• ubs: 식의 원래 변수들 가운데 하나(혹은 그 이상)에 대하여 수치값이나 다른 기호식으 로 치환 • subs(w, u, 2): 식 w에서 변수 u 대신에 2를 치환
>> d = 1, syms u v d = 1 >> w = u^2 - v^2 w = u^2-v^2 >> subs(w,u,2) ans = 4-v^2
>> subs(w,v,d) ans = u^2-1 >> subs(w,v,u+v) ans = u^2-(u+v)^2 >> simplify(ans) ans = -2*u*v-v^2
-
M-파일
• M-파일: MATLAB 명령어들을 포함하는 통상적인 텍스트 파일
• M-파일의 작성: MATLAB에 내장된 Editor(편집기)를 이용 - 상단 메뉴바에서 File->New->M-
File의 순서로 선택
• 명령어 입력라인에서 edit를 타이프, 혹은 edit 다음에 현재의 디렉토리에 있는 기존 M-파일의
이름을 타이프하여 시작
• 디렉토리 검색기에서 M-파일을 더블 클릭
• 스크립트 M-파일과 함수 M-파일로 구분
• M-파일의 저장: MATLAB 상단의 "Current Directory"를 이 파일이 저장된 디렉토리로 지정
-
•스크립트 M-파일
• 순서대로 수행되는 일련의 MATLAB 명령어들을 포함 • 보기:
format long x = [0.1 0.01 0.001]; y = sin(x)./x
• 저장시 확장자 “.m"을 반드시 포함 • 보기: 다음 스크립트를 편집기에서 작성한 다음 marks.m라는 이름으로 저장
markdat = [12 0 5 28 87 3 56]; exsort = sort(markdat) exmean = mean(markdat) exmed = median(markdat) exstd = std(markdat)
• 명령어 라인에서 이를 수행
>> marks exsort = 0 3 5 12 28 56 87 exmean = 27.2857 exmed = 12 exstd = 32.8010
-
•코멘트의 추가
• 퍼센트 기호(%): 코멘트의 시작 • % 기호가 있는 줄의 나머지 부분: 수행되지 않음
format long % 15자리로 표시 x = [0.1, 0.01, 0.001]; y = sin(x)./x % 이 값들은 x가 0에 접근함에 따라 % sin(x)/x는 1에 접근함을 보여준다.
• 코멘트에 여러 줄이 필요할 때: 각 줄이 시작될 때마다 맨 앞에 퍼센트 기호
•함수 M-파일
• 현재 사용중인 디렉토리나 MATLAB의 다른 경로에 위치해야 하는 평범한 텍스트 파일 • 저장할 때 파일 이름을 반드시 함수 이름과 같도록 해야 한다. • 보기:
function y = slm(c) % SLM은 x = 10^(-b)에 대하여 sin(x)/x를 계산한다. % 여기에서 b = 1, ..., c 이다. format long b = 1:c; x = 10.^(-b); y = (sin(x)./x)';
-
• 함수 M-파일의 첫 번째 줄: function으로 시작 - MATLAB은 이 파일을 함수 M-파일로 인식 • M-파일의 첫 번째 줄: 함수의 이름을 지정 • 함수 M-파일의 첫 번째 줄 다음에는 그 M-파일이 무엇을 위한 것인가를 설명하여 주는 코멘 트들을 추가 - help 명령어는 자동적으로 이 정보를 제시 • 예:
>> help slm SLM은 x = 10^(-b)에 대하여 sin(x)/x를 계산한다. 여기에서 b = 1, ..., c 이다.
• 함수의 수행: 명령어 라인에서 함수의 이름을 입력
>> slm(5) ans = 0.99833416646828 0.99998333341667 0.99999983333334 0.99999999833333 0.99999999998333
-
함수
•내장함수 • 대표적인 MATLAB 내장함수: sqrt, cos, sin, tan, log, exp, atan, gamma, erf, besselj 등
>> log(exp(3)) ans = 3
• 함수 log: 자연로그로서 “ln"으로 표현
>> sin(2*pi/3) ans = 0.8660
• 기호 인수의 사용:
>> sin(sym('2*pi/3')) ans = 1/2*3^(1/2)
• 선형방정식 시스템:
로 두면
-
• 백슬래쉬 함수의 이용:
>> A = [-3 0 -1; 2 5 -7; -1 4 8] A = -3 0 -1 2 5 -7 -1 4 8 >> b = [-3; 1; 2] b = -3 1 2 >> x = A\b x = 0.9124 0.2028 0.2627
•사용자 정의함수
• 명령어 inline을 사용 • 연산자 @를 사용하여 “익명함수”(anonymous function)를 생성 • 별도의 함수 M-파일로 생성
MATLAB에서 사용자가 자신의 함수를 정의하는 방법:
-
의 정의
inline을 사용:
>> f1 = inline('x^2', 'x') f1 = Inline function: f1(x) = x^2
익명함수를 생성:
>> f = @(x) x^2 f = @(x) x^2
정의된 함수의 계산:
>> f1(4) ans = 16 >> f(4) ans = 16
• 벡터에 대한 연산의 수행: 연산자 *, /, 그리고 ^ 앞에 마침표
-
• 의 벡터화된 버전:
>> f = @(x) x.^2 혹은 >> f1 = inline('x.^2', 'x') 예: >> f(1:5) ans = 1 4 9 16 25
• 다변수 함수의 정의:
>> g = @(x, y) x^2 + y^2; g(1,2) >> g1 = inline('x^2 + y^2', 'x', 'y'); g1(1,2)
• 벡터계산:
-
• 예: x가 y보다 클 경우 x와 y를 서로 교환
if x > y temp = y; y = x; x = temp; end
• elseif를 이용하여 하나, 혹은 그 이상의 조건들을 추가
•for 루프 • for 루프의 사용구조: for (변수) = (표현) (문장) end • 예: 조화수열 1/i의 처음부터 25번째 항까지의 합 >> s = 0; >> for i = 1:25, s = s + 1/i; end, s s = 3.8160
루프
• if 문장의 가장 간단한 형태:
• if 문
if (조건) (문장) end
• (조건)의 원소들이 모두 0이 아니면 (문장)이 수행
-
그래프
• ezplot을 이용한 그래프
• 단일변수 함수의 그래프를 그리는 가장 간단한 방법 • 함수를 나타내는 문자열, 기호식, 혹은 익명함수를 이용
• 예: 구간 -2에서 2 사이에서 의 그래프
>> ezplot('x^2 + x + 1', [-2 2])
• 기호식의 사용: >> syms x, ezplot(x^2 + x + 1, [-2 2])
• 익명함수의 사용:
>> ezplot(@(x) x.^2 + x + 1, [-2 2])
-2 -1.5 -1 -0.5 0 0.5 1 1.5 2
1
2
3
4
5
6
7
x
x2+x+1
-
•그래프의 보정
• 그래프 타이틀의 변경:
>> title '포물선'
•다른 방법: 그림창 상부의 Edit 메뉴에서 Axes Properties...를 선택
•라벨: ylabel - 세로축 라벨, xlabel - 수평 축 라벨
• axis: 수직축과 수평축의 범위를 변경
•예: 수직축의 범위를 0부터 3까지로 제한
>> axis ([-1 2 0 3])
•axis square: 그래프의 모양을 정사각형으로 변형
-
•plot을 이용한 그래프
• plot: 수치 데이터의 벡터에 대하여 작용
• plot(X, Y): X와 Y는 길이가 같은 벡터
>> X = [1 2 3]; Y = [4 6 5]; plot(X,Y)
1 1.2 1.4 1.6 1.8 2 2.2 2.4 2.6 2.8 34
4.2
4.4
4.6
4.8
5
5.2
5.4
5.6
5.8
6
-
• 기본적으로 2차원(2D) 그래프를 생성:
>> t = 0:0.005:1; z = exp(10*t.*(t-1)).*sin(12*pi*t);
>> plot(t,z)
0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1-0.8
-0.6
-0.4
-0.2
0
0.2
0.4
0.6
0.8
-
• fplot: 문자열로 표시되는 함수의 그래프를 작성
•>> fplot('exp(10*t.*(t-1)).*sin(12*pi*t)', [0 1 -0.8 0.8])
• [-1, 3]에서 ● 의 그래프 작성:
x의 범위를 지정하고 x에 따른 함수값 y를 계산한 다음 plot 함수를 이용
• grid: 그래프에 격자를 삽입
>> x = -1:0.1:3; >> y = x.^2 -3*x +1; >> plot(x,y) >> grid >> title('x^2 -3*x +1') >> xlabel('x'), ylabel('y')
-1 -0.5 0 0.5 1 1.5 2 2.5 3-2
-1
0
1
2
3
4
5x2 -3*x +1
x
y
-
•여러 곡선들의 그래프
•두 개 이상의 곡선들을 하나의 그래프 상에 겹쳐 그리려면 hold on을 이용
•hold on은 hold off를 입력할 때까지 유효
•예: >> ezplot('exp(-x^2)', [0 10]) >> hold on >> ezplot('cos(x)', [0 10]) >> hold off >> title 'exp(-x^2) and cos(x)'
0 1 2 3 4 5 6 7 8 9 10
-1
-0.5
0
0.5
1
x
exp(-x2) and cos(x)
• plot의 이용: >> x = 0:0.01:10; plot(x, exp(-x.^2), x, cos(x)) • hist: 히스토그램 >> hist(randn(1000,1))
-3 -2 -1 0 1 2 30
50
100
150
200
250
-
•3차원 그래프
•3차원 그래프는 명령어 plot3를 사용
• 구간 (t는 0.1씩 증가)에서 함수
의 3차원 그래프:
» t = [0:0.1:4*pi]; » y1 = sin(t/2); » y2 = cos(t/2); » y3 = cos(t/2); » plot3(y1, y2, y3) » xlabel('x 축') » ylabel('y 축') » zlabel('z 축') » title('3차원 그래프') » grid
-
•미분방정식의 풀이
• MATLAB은 미분방정식의 풀이를 위한 많은 다양한 함수들을 내장
• ode45는 ode23과 함께 가장 널리 사용
• ode45를 사용한 미분방정식의 풀이: (구간: )
• 주어진 미분방정식을 나타내는 함수 M-파일을 작성:
% myode1.m : 간단한 미분방정식의 보기 function dy = myode1(t,y) % dy = myode1(t,y)는 미분을 계산한다. dy = - y - sin(3*t);
• Command Window(명령어 창)에서 아래 코드를 수행:
>> tinv = [0 3]; y0 = 1; >> [t,y] = ode45(@myode1,tinv,y0); >> plot(t,y)
0 0.5 1 1.5 2 2.5 3-0.4
-0.2
0
0.2
0.4
0.6
0.8
1
-
MATLAB 활용의 보기
• 개체증가모델의 계산
• 개체증가모델(population growth model):
• MATLAB Editor/Debugger window에서 다음과 같은 프로그램을 작성: function [t, x] = pmod(a, xinit, n) x(1) = xinit; t(1) = 0; for k = 2:n+1; t(k) = k-1; x(k) = a*x(k-1)*(1-x(k-1)); end
• 위의 함수 M-파일을 pmod라는 이름으로 저장
• 다음에 원래의 MATLAB window로 되돌아 와서 이 함수를 사용하는 프로그램을 작성하고 실행:
a는 2.8, 초기값은 0.1, 시간은 30까지로 설정
» [ts, xp] = pmod(2.8, 0.1, 30); » plot(ts, xp) » xlabel('time step') » ylabel('population') » title('Population growth model')
-
•불규칙 Fibonacci 수열
• 불규칙 Fibonacci 수열 은 과 가 정해진 후 다음 관계로부터 생성:
• ±는 +와 -가 선정될 확률이 같아야 함을 의미
• 아주 큰 n에 대하여 은 1의 확률로 의 배수처럼 증가 ( )
• 함수 M-파일을 작성한 다음 fbn이라는 이름으로 저장:
% fbn.m : 불규칙 Fibonacci 수열 rand('state',100) % Set random number state. m = 1000; % 반복계산 횟수 x = [1 2]; % 초기조건 for n = 2:m-1 % for loop x(n+1) = x(n) + sign(rand-0.5)*x(n-1); end semilogy(1:1000,abs(x)) c = 1.13198824; hold on semilogy(1:1000,c.^[1:1000]) hold off
-
• for 루프: 불규칙 Fibonacci 수열을 배열 x에 저장
• 새로운 원소 x(n+1)이 할당될 때마다 자동적으로 x를 확장
• semilogy 함수는 n을 x 축에, abs(x)를 로그로 나타낸 y 축에 도시
• hold on: 다음번의 그림을 현재의 그림 위에 겹쳐 도시
• 두 번째 semilogy 함수: 기울기가 c인 직선의 그래프를 생성
• 명령어 라인에서 >> rfib을 입력:
0 100 200 300 400 500 600 700 800 900 100010
0
1010
1020
1030
1040
1050
1060
-
• 상미분 방정식의 풀이
• ode45 함수를 이용한 상미분 방정식(ODE) 시스템의 풀이: Lorenz 방정식 군
•초기조건: , 풀이구간:
-
• 먼저 미분방정식 시스템을 정의하는 함수 M-파일을 작성: function dy = ldes(t,y) dy = [10*(y(2)-y(1)) 28*y(1)-y(2)-y(1)*y(3) y(1)*y(2)-8*y(3)/3];
•미분방정식 시스템을 풀기 위한 스크립트 M-파일 derun.m(이름은 자유로이 붙일 수 있다)을 작성
•derun을 입력: 곡선이 시간에 따라 완성
% derun.m : 상미분 방정식 시스템의 풀이 tspan = [0 50]; % Solve for 0
-
• 3차원 객체의 생성
•내부를 제거한 3차원(3D) 객체생성의 보기: 다음 스크립트 M-파일 sobj.m을 작성하고 명령어
라인에서 sobj를 입력
% sobj.m : 속이 빈 3차원 객체를 생성 N = 10; % 증분 횟수. 이 값을 증가시켜 보자. z = linspace(-5,5,N)'; radius = sqrt(1+z.^2); theta = 2*pi*linspace(0,1,N); X = radius*cos(theta);2 Y = radius*sin(theta); Z = z(:,ones(1,N)); surf(X,Y,Z) axis equal
•surf(X,Y,Z): 3D 표면을 생성 - 높이 Z(i,j)는 x-y 평면의 점 (X(i,j),Y(i,j))에서 지정 -4
-20
24
-5
0
5
-5
0
5