Matlab Tutorialpds7.egloos.com/pds/200805/08/36/matlab_tutorial-brown... · 2008-05-08 · 2 2nd...

20
1 2nd Semester, 2005 Matlab Tutorial Prof. Youngseuk Keehm (김영석) Tel: 041-850-8517 Office: 자연과학관 231 Email: [email protected] 조교: 이민희 (245, 010-6361-4383) 2 nd Semester, 2005 참고도서 참고도서: Mastering Matlab 7, 2004, Hanselman and Littlefield, Prentice Hall. Mastering AutoCAD 2005 and AutoCAD LT 2005, 2004, Omura, Sybex. Autocad 2002, 2002, 김영숙, 세진사. 2 nd Semester, 2005 What you can do in Matlab? MATLAB = MATrix LABoratory 1. Elementary function, data analysis, 2D and 3D graphics, interpolation, grid 2. Signals, Fourier transforms, special functions 3. Least-squares, matrix function, integration, differential functions 4. Statistics, stochastic simulations 5. Image processing, Movie 6. CAD 개요, 좌표계, 기본 도형 및 응용 7. 개체 스냅 및 편집, 문자와 치수 기입 8. 레이어의 이해와 이용 9. 도면배치 및 출력 10. 면구조(Surface)와 렌더링(Rendering) 11. 3차원 면의 재질 및 광원효과 2 nd Semester, 2005 Matlab - Introduction 1. Starting Matlab – who(s), ls, pwd, cd, diary 2. Datatypes 3. Creating variables 4. Vector/Matrix Variables and Accessing 5. Display format 6. plotting 7. Vector/Matrix operators 8. Max, Min, Mean, Sum 9. Transpose, flip 10. ones, zeros, eye, cascading, extracting 11. load data 12. cell structure 13. Basic matrix calculations 2 nd Semester, 2005 Basics of Matlab 1. Review of Matlab basics 컴퓨터 구조, 파일시스템, OS who(s), ls, pwd, cd, diary 2. 변수의 선언 스칼라, 벡터, 행렬 “help datatypes” 3. 변수들에서 필요한 요소의 추출 4. Vector/Matrix 연산자 들 + -* .* / ./ \ .\ ^ .^ 5. Max, Min, Mean, Sum, Std 2 nd Semester, 2005 Basics of Matlab – cont. 6. Transpose, flip 7. ones, zeros, eye, cascading, extracting 8. 매트랩 데이터의 로드와 저장 9. 매트랩 기본 함수들 (elfun) 10. Loop 11. If, else, end 문의 구조

Transcript of Matlab Tutorialpds7.egloos.com/pds/200805/08/36/matlab_tutorial-brown... · 2008-05-08 · 2 2nd...

1

2nd Semester, 2005

Matlab Tutorial

Prof. Youngseuk Keehm (김영석)Tel: 041-850-8517

Office: 자연과학관 231Email: [email protected]

조교: 이민희 (245호, 010-6361-4383)

2nd Semester, 2005

참고도서

참고도서: Mastering Matlab 7, 2004, Hanselman and Littlefield, Prentice Hall.Mastering AutoCAD 2005 and AutoCAD LT 2005, 2004, Omura, Sybex.Autocad 2002, 2002, 김영숙, 세진사.

2nd Semester, 2005

What you can do in Matlab?MATLAB = MATrix LABoratory

1. Elementary function, data analysis, 2D and 3D graphics, interpolation, grid

2. Signals, Fourier transforms, special functions3. Least-squares, matrix function, integration, differential functions 4. Statistics, stochastic simulations5. Image processing, Movie6. CAD 개요, 좌표계, 기본 도형 및 응용

7. 개체 스냅 및 편집, 문자와 치수 기입

8. 레이어의 이해와 이용

9. 도면배치 및 출력

10. 면구조(Surface)와 렌더링(Rendering)11. 3차원 면의 재질 및 광원효과

2nd Semester, 2005

Matlab - Introduction1. Starting Matlab – who(s), ls, pwd, cd, diary2. Datatypes3. Creating variables4. Vector/Matrix Variables and Accessing5. Display format6. plotting7. Vector/Matrix operators8. Max, Min, Mean, Sum9. Transpose, flip10. ones, zeros, eye, cascading, extracting11. load data12. cell structure13. Basic matrix calculations

2nd Semester, 2005

Basics of Matlab1. Review of Matlab basics

컴퓨터 구조, 파일시스템, OSwho(s), ls, pwd, cd, diary

2. 변수의 선언 – 스칼라, 벡터, 행렬“help datatypes”

3. 변수들에서 필요한 요소의 추출

4. Vector/Matrix 연산자 들+ - * .* / ./ \ .\ ^ .^

5. Max, Min, Mean, Sum, Std

2nd Semester, 2005

Basics of Matlab – cont.6. Transpose, flip

7. ones, zeros, eye, cascading, extracting

8. 매트랩 데이터의 로드와 저장

9. 매트랩 기본 함수들 (elfun)

10. Loop

11. If, else, end 문의 구조

2

2nd Semester, 2005

파일시스템과 메모리

1. 컴퓨터 구조, 파일시스템(하드디스크), Ram

- 데이터를 저장하거나 읽어올 때는 하드디스크를 access 하는 데 매트랩

메인윈도우의 “current directory”에서 확인한다. 매트랩을 실행하면 자동

으로 C:\Matlab7.0\Work라는 디렉토리에서 시작한다. 이것을 변경할 경우

“cd”라는 명령어를 사용하고, 현재 자기가 어디 있는 지 확인하고 싶은 경

우는 “pwd”를 쓴다. 현재 디렉토리에 어떤 파일이 있는 가를 보고 싶은 경

우는 “ls” 나 “dir”을 사용한다.

- 현재 쓰고 있는 변수들은 메모리상에 위치하는 데 이를 매트랩에선

“workspace”라고 한다. 지금 어떠한 변수를 가지고 있는 지 확인할 때는

“whos”라는 명령어를 쓴다.

2. 변수의 선언 – 스칼라, 벡터, 행렬, integer, single-precision, double-precision (“help datatypes” 로 가능한 변수의 타입을 확인할 수 있다.)

어떠한 데이터타입인지 지정하지 않고 변수를 만드는 경우는 자동으로

double precision으로 생성된다. (matlab에선 “double” type)

2nd Semester, 2005

변수의 선언

2. 변수의 선언 (계속)

- 변수를 선언하는 방법은 여러가지가 있는데 (1) 파일에서 읽어오는 방법, (2) 계산식으로 만드는 방법 (3) 초기값을 주고 일단 정의 하는 방법 등이

있다.

(1) matlab data file (*.mat)이 있는 경우: “load mydata.mat”

일반 text (ascii) 파일인 경우: “load”, “textread”, “dlmread”, “fscanf”

(2) 계산식으로 만드는 방법

(예) >> x=linspace(0, 2*pi, 101);

>> y=sin(x);

(3) 초기값으로 정의하는 방법 (ones, zeros)

(예) >> x=zeros(10,10) % 10x10 행렬을 만들고 0으로 초기화

>> y=20*ones(4,2) % 4x2 행렬을 만들고 20으로 초기화

>> z=eye(5) % 5x5 의 단위행렬(I) 생성

2nd Semester, 2005

변수에서 필요한 부분 추출

3. 변수의 추출

(1) 필요한 범위를 “:”를 이용해 추출하는 방법

>> a = rand(10,10); % 10x10 random number 행렬

>> b = a(2:5, 4:6); % 2행에서 4행까지, 4열에서 6열까지 추출

>> c = a([1 4 5], [3 8 9]) % 1,4,5행과 3,8,9열 추출

>> d = a(:, [9 8 6]) % 9,8,6번째 열의 모든 원소를 이 순서로 배열

(2) 논리식으로 추출하는 방법

>> a = [1 3 -8 9 2 -1 -5];

>> b = a( a<0) = [ -8 -1 -5] % b는 3개의 요소를 가지는 vector

>> b = a( find(a<0) ) %위와 같은 결과

>> ind1 = a<0 = [ 0 0 1 0 0 1 1]; % 원래 vector와 같은 사이즈, boolean

>> ind2 = find(a<0) = [3 6 7]; % 실제 인덱스를 리턴

2nd Semester, 2005

변수에서 필요한 부분 추출

3. 변수의 추출

(2) 논리식으로 추출하는 방법 (계속)

>> a = [1 3 -8 9 2 -1 -5];

>> b = a( a>0 & a<5 ) = [ 1 3 2] % 논리연산 AND

&: AND, |: OR, ~=: NOT EQUAL; ==: EQUAL; >, <, >=, <=

>> c = [ 1 2 -5 4 9 -3 0 -2 4 3 2;

3 -4 1 2 -4 4 1 -8 1 9 -1];

>> d = c( [c(1,:)>0 & c(2,:)<0], :) = [ 9 2;

-4 -1];

c의 1행이 0보다 크고 2행이 0보다 작은 모든 열의 집합

* 행렬에서 논리식으로 추출할 경우 특히 주의를 하여야 한다.

2nd Semester, 2005

변수에서 필요한 부분 추출

3. 변수의 추출

논리식으로 추출하는 방법 (예제 문제)

>> a = [ 1 2 3 4 5 6 7 8 9 10;

0.1 0.4 -0.1 0.2 0.4 0.5 0.6 0.3 0.2 -0.1];

(1) 1행은 시간이고 2행이 해수의 상대적 높이라고 할 때, 해수의 상대적 높이가

음수인 경우를 제외한 데이터 b를 구하라.

>> b = a( [a(2,:)>=0] , :);

* 행과 열의 논리식을 따로 써 주는 것에 주의

(2) 시간이 3과 8사이에 있으면서, 해수의 높이가 0.2 보다 높은 경우인 데이터

c를 구하라

>> b = a( [a(1,:)>=3 & a(1,:)<=8 & a(2,:)>0.2], :);

2nd Semester, 2005

행렬의 연산4. Vector/Matrix 연산자 들

+ - * .* / ./ \ .\ ^ .^ 연산자 앞에 마침표가 있는 경우에는각 요소들 간의 연산으로 정의가 된다.

(예)

(참고)

(질문) 왜 나눗셈 operator가 두 개일까? (/ 와 \)

⎟⎟⎠

⎞⎜⎜⎝

⎛−−

=⎟⎟⎠

⎞⎜⎜⎝

⎛ −=

⎟⎟⎠

⎞⎜⎜⎝

⎛−

=⎟⎟⎠

⎞⎜⎜⎝

⎛−

=

122150

*.,224

43*

3150

,4231

BABA

BA

BABA

BABA

*7.01.09.23.0

\

*0.24.0

0.12.1/

1

1

≈⎟⎟⎠

⎞⎜⎜⎝

⎛−=

≈⎟⎟⎠

⎞⎜⎜⎝

⎛−−

=

3

2nd Semester, 2005

간단한 통계 함수5. 통계 operator

: min(), max(), sum(), mean(), median(), var(), std(): bar(), bar3(), hist(), hist3(), boxplot(): rand(), randn(), unidrnd(), unifrnd()

(문제) A가 행렬인 경우 max(A)는 ?

(문제) A가 행렬인 경우 한번에 평균값을 구하는 방법?

(문제) mean 과 median의 차이는?

(문제) bar 와 hist의 차이는?

2nd Semester, 2005

데이터의 로드와 저장6. 데이터(파일)의 입출력

(a) 현재 메모리 (workspace)에 있는 변수,데이터의 저장

: save()를 이용한다.(예) >> save myData.mat data1 data2 data3: 이 경우에는 myData.mat는 binary file이 된다.

>> save myData.txt data4 –ascii: 이 경우는 acsii 파일 즉 아무 뷰어로나 볼 수 있는 텍스트 파일이 된다.

(b) 데이터 파일을 읽어 오는 경우

: load() 를 이용한다.>> load myData.mat % matlab format file>> load myData.txt % ascii file

(참고) ascii file을 읽을 경우 데이터 포맷의 열 갯수가 모든 행에서 일치 해야만한다.

(다른 예) textread, dlmread, fscanf (help 를 사용하여 그 용도를 익힐 것)

2nd Semester, 2005

예제 문제현재까지 배운 내용을 다음 예제를 통해서 익힌다.

주어진 data (hw1data.mat)를 로드해서 다음을 실습해 본다.

(a) 데이터를 읽어서 포함되어 있는 변수와 크기를 알아보라.

(b) 변수 중 하나를 ascii format으로 데이타 파일로 저장하고, notepad로 그 내용을 확인해 보라.

(c) 변수 중 하나를 plot, scatter, hist를 이용해서 그래프를 그려보라.

(d) 변수 중에서 행렬로 되어 있는 것을 골라 일정 깊이에 있는 것 만을 선택적으로 추출해 보라.

(e) 추출된 데이터의 기본적인 통계학적 값들을 구해보라.

2nd Semester, 2005

2D & 3D graphics매트랩이 공학이나 수치해석에서 강력한 툴이 된 이유 중의 하나가 내장되어 있

는 다양하고 매우 유용한 그래픽 함수 때문이다. 실제로 계산이나 데이터

처리를 한 이후에는 그것을 어떻게 visualization할 것인가는 이제 수치해

석 자체만큼이나 중요한 문제가 되었다.

이번 장에서는 기본적으로 매트랩이 제공하는 여러가지 graphic function들에 대

해 알아보고 실제 예제와 과제을 통해 자기 것으로 만드는 것을 목적으로

한다.

매트랩이 제공하는 방대한 양의 그래픽 함수들에 대해 세세히 다루기는 불가능

하므로 각자 개인이 graphics에 어떠한 함수와 유틸리티가 있는 지 알아보

기 바람.

>> help graphics (또는 graph2d, graph3d, specgraph)

2nd Semester, 2005

Cross plotsCross plot이란 2차원에 x와 y값을 가지는 변수들을 선, 점, 도형등으로 표시하는

가장 기본적인 것을 말한다.

이 범주에 드는 가장 대표적인 함수들이 “plot()”, “scatter()”, “plotyy()” , “ezplot()” , “semilogx()”, “semilogy()”, “loglog()”등이 있다.

(예) >> plot(x, y, ’r’) % line plot with red line

>> scatter(x, y, s, c) % 점으로 표현된 그림, s는 각 점의 크기, c는 칼라

>> plotyy(x1,y1, x2,y2) % 두개의 그래프를 한 그림에 표시

>> ezplot( ‘sin(x)’, [0 6*pi]) % 문자로 표현된 함수의 그림그리기

>> semilogy(x, y, ‘ro’) % 데이터를 빨간 원으로 표시, y축 log scale

* 각 함수의 help를 살펴보면 예제와 옵션이 자세히 나와 있다.

2nd Semester, 2005

Graphics Handler이러한 그래픽들은 아주 다양한 옵션들 (예를 들어 선의 굵기, 좌표축의 최소,

최대값, 각 축에 있는 tic mark를 어디다 찍을 지, 각 축의 라벨의 폰트와

사이즈 등등) 을 가지고 있는데 이를 함수 자체에서 인자로 모두 넣기란

불가능 하다. 그래서 Figure나 Graph를 그리는 모든 함수는 그것들의

handler (제어자) 를 넘겨주는 데 다음의 예를 살펴보자.

>> h1 = figure;

>> h2 = plot(x, y, ‘g--’)

여기서 h1과 h2는 각각 그림자체와 그 속에 있는 graph를 제어할 수 있는

제어자가 된다. 이 제어자가 어떠한 속성들을 갖고 있는 지 보려면,

>> get(h2)

이 제어자를 이용해 그림의 속성중 하나를 바꾸려면 (예를 들어 선 두께),

>> set(h2, ‘linewidth’, 3)

와 같이 쓰면 된다.

>> axis % 현재 축의 최대, 최소값 표시 또는 셋팅

4

2nd Semester, 2005

Graphics Handler>> get(h1) % FigureAlphamap = [ (1 by 64) double array]

BackingStore = onCloseRequestFcn = closereqColor = [0.8 0.8 0.8]Colormap = [ (64 by 3) double array]CurrentAxes = [304.002]CurrentCharacter = hCurrentObject = []CurrentPoint = [0 0]DockControls = onDoubleBuffer = on…Position = [420 528 560 420]Renderer = painters…

2nd Semester, 2005

Graphics Handler>> get(h2) % Plot

Color: [0 0 1]EraseMode: 'normal'LineStyle: '-'LineWidth: 0.5000

Marker: 'none'MarkerSize: 6

MarkerEdgeColor: 'auto'MarkerFaceColor: 'none'

XData: [1 2 3 4 5 6 7 8 9 10]YData: [1x10 double]ZData: [1x0 double]

BeingDeleted: 'off'ButtonDownFcn: []

Children: [0x1 double]……

2nd Semester, 2005

Graphics Handler>> get(gca) % Axes

…Color = [1 1 1]…FontName = HelveticaFontSize = [10]FontUnits = pointsFontWeight = normal…LineStyleOrder = -LineWidth = [0.5]…Position = [0.13 0.11 0.775 0.815]TickLength = [0.01 0.025]TickDir = in…XTick = [ (1 by 10) double array]

XTickLabel = 1 2 …10

XTickLabelMode = auto…YTick = [ (1 by 9) double array]YTickLabel =

0.2…1

…Children = [305.002]…

2nd Semester, 2005

Subplot하나의 그림판에 여러개의 그래프를 표시해야 하는 경우가 종종 생긴다.

-2.5 -2 -1.5 -1 -0.5 0 0.5 1 1.5 20

2

4

6

8

10

12

Value

# o

f da

ta

0 0.2 0.4 0.6 0.8 1-3

-2

-1

0

1

2

Val

ue

Time

이러한 경우 subplot()을 사용한다.

>> subplot(2, 1, 1)>> hist(value, 20)>> subplot(2, 1, 2)>> plot(time, value, ‘.’)

2nd Semester, 2005

Surface Plot – surf()면구조를 그리는 경우의 가장 쉬운 예는 Topographic map이다. 이 경우에 2차원

(x,y)의 지점마다 높이가 주어진다. 이러한 경우는 surf()가 가장 대표적으

로 쓰이는 함수이다.

z 라는 변수가 100x100 의 크기를 가지고 각각의 위치는 높이를 나타낸다고 하

자. 이 경우 각각의 좌표는 등간격을 가진다. (dx=dy=const)

>> z = peaks(100);

>> surf(z)

>> shading interp

>> camlight

>> lighting phong

>> print –djpeg99 a.jpg

2nd Semester, 2005

Surface Plot – surf()앞의 예제와 같은 면구조를 나타내는 또 하나의 범용적인 방법은 등고선으로 나

타내는 것이다. 다음의 예제는 contour()을 이용해 등고선도를 그린것이다. 등고선도의 높이를 나타내기 위해서 colorbar()를 이용하여 그림의 우측에

등고선 색의 높이를 표시하고 있다.

>> z = peaks(100);

>> contour(z, [-10:0.5:10] )

>> colorbar

10 20 30 40 50 60 70 80 90 100

10

20

30

40

50

60

70

80

90

100

-6

-4

-2

0

2

4

6

5

2nd Semester, 2005

Surface Plot – 비등간격 데이타

앞의 예제에서는 주어진 자료가 등간격으로 (Grid data) 주어져 있기 때문에 그 값을 그냥

이용해서 면구조나 등고선도를 그릴 수 있었다. 하지만 많은 경우 데이타가 등간격

이 아니므로, 이 경우는 등간격의 데이타를 생성하는 작없이 필요하다. Griddata() 또는 interp2()이용.

<주어진 데이타>이 경우에는 주어진 데이타가 x, y, z 세개

일 것이다. 그림에서 보듯이 x, y가 등간격

이 아니므로 먼저 등간격의 x1,y1을 만든다.>> [x1,y1]=meshgrid(0:2:100, 0:2:100);그 다음엔 주어진 자료들로 부터 (x1,y1)에서

의 예측 값들을 구한다.>> z1 = griddata(x, y, z, x1, y1);또는

>> z1 = interp2(x, y, z, x1, y1);

10 20 30 40 50 60 70 80 90

10

20

30

40

50

60

70

80

90

2nd Semester, 2005

비등간격 데이타 - 예제

Original Data

비등간격, incomplete datagriddata 이용 후의 결과

2nd Semester, 2005

그림화일과 같은 2차원 구조앞에서 우리는 지각과 같은 면의 높이가 주어

진 상태에서 relief map이나 등고선도를그리는 방법에 대해서 알아보았다.

우리가 잘아는 그림파일들도 (bmp, jpg, tiff) 이와 똑같이 2차원 구조를 가진다. 그림파일을 표시하는 함수는 imagesc(), pcolor()와 같은 것이 있고 2차원 data에는 언제나 사용가능 하다. 그림파일을특수하게 다루는 함수에는 imread(), imshow()등이 있다.

>> subplot(2,1,1)>> imagesc(z)>> subplot(2,1,2)>> pcolor(z)

20 40 60 80 100

20

40

60

80

100

20 40 60 80 100

20

40

60

80

100

2nd Semester, 2005

3차원 데이타 Graphics앞에까지 다룬 예제는 실제는 2차원 data이다. 여기서는 실제 3차원 자료, 즉 3

차원 grid의 각 점마다 데이타가 주어진 경우를 다루어 보자.Data는 3차원에서 구슬을 채워넣은 공극구조 (random pack of spheres)를 염수

로 포화시키고 전류를 흘려서 전류장을 구한 결과이다.

>> load curr.mat>> whos curr

Name Sizecurr 101x101x101

>> subplot(211)>> slice(curr, [1],[1],[101])>> shading flat>> axis tight>> axis image>> colorbar

2nd Semester, 2005

3차원 데이타 Graphics앞의 그림은 가장자리 면의 전류를 표시하기 때문에 실제 어떻게 전류가 흘렀는

지 보기가 힘들다. 다음과 같이 하면 보다 직관적으로 이해하기 쉬운 그림을 그릴 수 있다.

>> slice(curr, [ ],[ ],[14 40 70])>> shading flat>> axis tight>> colorbar

2nd Semester, 2005

NaN

NaN은 특별한 데이터 타입으로 Not-A-Number의 약자이다. 실제로 정규적인 데이

타에서 빠진 데이터나 에러가 난 데이타를 -999나 다른 의미 없는 숫자로 대

체 하는데 이와 비슷한 역할을 한다.

이러한 NaN을 포함한 데이타를 위해 특별한 함수들이 있다.

nanmean(), nanmedian(), nanstd(), nanvar(), nanmin(), nanmax(), nansum(),isnan()

6

2nd Semester, 2005

Linkaxes()

>> ax(1) = subplot(1,2,1);

>> plot(vshale,depth), axis ij

>> ax(2) = subplot(1,2,2); >> help linkaxes를 이용하여

>> plot(porosity,depth), axis ij y축만을 링크하는 방법을 알아보라.

>> linkaxes(ax)

0 0.5 1

0.2

0.4

0.6

0.8

1

1.2

1.4

1.6

1.8

x 104

0 0.5 1

0.2

0.4

0.6

0.8

1

1.2

1.4

1.6

1.8

x 104

0 0.2 0.4 0.6 0.8

3000

4000

5000

6000

7000

8000

0 0.2 0.4 0.6 0.8

3000

4000

5000

6000

7000

8000

2nd Semester, 2005

Graphic Handler revisited

>> h=plot(vshale);

>> axis ij

>> set(gca,’fontname’,’tahoma’,fontsize’,11)

>> xlabel('Vsh')

>> ylabel('Depth (ft)')

0 0.2 0.4 0.6 0.8 1

0.2

0.4

0.6

0.8

1

1.2

1.4

1.6

1.8

x 104

Vsh

Dep

th (

ft)

2nd Semester, 2005

Graphic Handler revisited

>> h=plot(vshale,depth);

>> axis ij

>> set(gca,’fontname’,’tahoma’,’fontsize’,11)

>> xlabel('Vsh')

>> ylabel('Depth (ft)')

>> set(h, ‘color’, ‘r’)

0 0.2 0.4 0.6 0.8 1

0.2

0.4

0.6

0.8

1

1.2

1.4

1.6

1.8

x 104

Vsh

Dep

th (

ft)

2nd Semester, 2005

Graphic Handler revisited

>> h=plot(vshale);

>> axis ij

>> set(gca,’fontname’,’tahoma’,fontsize’,11)

>> xlabel('Vsh')

>> ylabel('Depth (ft)')

>> set(h, ‘color’, ‘r’)

>> set(gca, ‘color’, ‘b’)

0 0.2 0.4 0.6 0.8 1

0.2

0.4

0.6

0.8

1

1.2

1.4

1.6

1.8

x 104

Vsh

Dep

th (

ft)

2nd Semester, 2005

Graphic Handler revisited

>> h=plot(vshale);

>> axis ij

>> set(gca,’fontname’,’tahoma’,fontsize’,11)

>> xlabel('Vsh')

>> ylabel('Depth (ft)')

>> set(h, ‘color’, ‘r’)

>> set(gca, ‘color’, ‘b’)

>> set(gcf, ‘color’, ‘g’)

0 0.2 0.4 0.6 0.8 1

0.2

0.4

0.6

0.8

1

1.2

1.4

1.6

1.8

x 104

Vsh

Dep

th (

ft)

2nd Semester, 2005

많이 쓰이는 handler’s properties

>> set(gca, ‘position’, …) %그림판 안에서 plot의 상대적 위치

>> set(gca, ‘fontname’, ‘times’, ‘fontsize’, 11) % x,y축의 레이블 폰트와 사이즈

>> set(gca, ‘xtick’, [ 0 1 2]) % x축의 tic 마크의 빈도와 위치

>> set(gca, ‘xticklabel’, {‘One’, ‘Two’, ‘Three’}) % tic label이 특수한 문자일 때

>> set(gcf, ‘renderer’, ‘zbuffer’) % 면구조 렌더링 방법 (painter, zbuffer, opengl)

나머지는 각자 알아볼 것.

7

2nd Semester, 2005

그림창의 메뉴들

File – new, open, close, save, save as, generate m-file, preferences, export setup, page setup, print setup, print preview, print

Edit – copy figure, copy options, figure properties, axes properties

View – figure toolbars, camera toolbars, plot edit toolbars, property editor

Insert – x,y,z label, title, legend, line, arrow, etc.

Tools – edit plot, zoom, rotate, axes properties, basic fitting, data statistics

2nd Semester, 2005

Plot 과 같이 많이 쓰이는 함수들

title()

xlabel()

ylabel()

text()

gtext()

grid on/off

hold on/off

axis()

subplot()

axes()

ginput()

view()

2nd Semester, 2005

Matlab Function: m-fileFortran 의 subroutine 이나 function, 또는 C/C++의 method function과 같이 동

일한 작업수행이 요구되는 일에는 function을 만드는 것이 능률적이다.

매트랩에서 우리가 흔히 쓰는 많은 명령어들은 이런한 function들이며 대부분

이 .m이라는 확장자를 가진 텍스트 (ASCII) 파일들이다.

이러한 파일을 생성, 수정하는데에는 edit 명령어가 쓰인다.

예를 들어서 평균을 구하는 mean 함수의 경우를 살펴보자.

>> edit mean

을 치면 edit window가 뜨고 mean()함수의 내용이 창에 표시된다.

2nd Semester, 2005

Matlab Function: m-file

function y = mean(x,dim)%MEAN Average or mean value.% For vectors, MEAN(X) is the mean value of the elements in X. For% matrices, MEAN(X) is a row vector containing the mean value of% each column. For N-D arrays, MEAN(X) is the mean value of the% elements along the first non-singleton dimension of X.%% MEAN(X,DIM) takes the mean along the dimension DIM of X. %% Example: If X = [0 1 2% 3 4 5]%% then mean(X,1) is [1.5 2.5 3.5] and mean(X,2) is [1% 4]%% Class support for input X:% float: double, single

2nd Semester, 2005

Matlab Function: m-file

%% See also MEDIAN, STD, MIN, MAX, COV.

% Copyright 1984-2004 The MathWorks, Inc. % $Revision: 5.17.4.1 $ $Date: 2004/03/09 16:16:26 $

if nargin==1, % Determine which dimension SUM will usedim = min(find(size(x)~=1));

if isempty(dim), dim = 1; end

y = sum(x)/size(x,dim);else

y = sum(x,dim)/size(x,dim);end

2nd Semester, 2005

함수의 선언

함수의 맨 처음은 항상 다음과 같은 형태를 가진다.function y = mean(x,dim)

이 파일이 함수임을 나타냄

계산결과가 y라는 변수로 출력

함수의 이름이 mean

두개의 input 변수를 가짐

예를 들어 두개의 데이타 x,y를 받아서 특별한 그림을 그리는 함수를 우리가 만든다

고 하자. 그러면 그 함수는 다음과 같은 형태를 지닐수 있다.function myPlot(x,y)

이 경우는 output이 화면에 그림으로 출력되기 때문에 따로 변수(계산결과)를 돌려

줄 필요가 없어서 y가 생략되어 있다.

8

2nd Semester, 2005

함수의 설명문

함수의 선언부 바로 다음에 빈 줄이 없이 % 기호로 시작되는 설명문이 등장한다.function y = mean(x,dim)%MEAN Average or mean value.% For vectors, MEAN(X) is the mean value of the elements in X. For% matrices, MEAN(X) is a row vector containing the mean value of% each column. For N-D arrays, MEAN(X) is the mean value of the% elements along the first non-singleton dimension of X.%

이 부분에는 대개 이 함수의 설명과 그 사용법이 들어간다. 앞에서 배운 help를 치

면 바로 이부분이 여러분의 command window에 표시된다. 다시 말하면 함수

의 help 에 해당되는 부분이다.

%로 시작되는 것은 설명문이라고 해석된다. (Fortran에서 C로 시작하는 comment문과 같은 역할). 하지만 함수선언 부분과 이 설명문 사이에 빈 줄이 없다는

사실에 주의 하라. 만약 빈 줄이 있으면 이 부분은 help를 이용할 때 표시 되

는 않는다.

2nd Semester, 2005

함수의 설명문

설명문을 따라 가다 보면 빈 줄이 있고 설명문이 계속된다. 따라서 help를 이용했을

때, 아랫부분은 표시되지 않는다.%% Class support for input X:% float: double, single%% See also MEDIAN, STD, MIN, MAX, COV.

% Copyright 1984-2004 The MathWorks, Inc. % $Revision: 5.17.4.1 $ $Date: 2004/03/09 16:16:26 $

여기에서 Copyright 와 버젼등의 관계를 숨어있는 설명문에 포함하고 있다.

2nd Semester, 2005

함수의 내용 (implementation)dim = min(find(size(x)~=1));

처음 이 문을 접하면 상당히 복잡해 보인다. 하나하나씩 살펴보면,

size(x) : size()는input 변수의 사이즈를 알려주는 함수이다. 만약 A가 3x4x2의 3차

원 행렬이면 size(A) 는 [3 4 2]를 return한다.

find( size(x) ~= 1) : find는 size(x)가 1이 아닌 경우의 그 첨자(index)를 return 한다. 현재 A의 경우는 모두가 크기가 1이 아니므로 [1 2 3]을 리턴한다.

min(find(size(x)~=1)): 찾아진 첨자중 제일 작은 것을 리턴한다. 여기서는 1이 제

일 작다. 그러므로 1방향이 최종계산값이다.

A=[1 2 3 5] (행벡터)의 경우, 위의 표현은 어느 방향을 리턴하는가?

size(A) = [1 4] find( size(A) ~= 1) = [2] % 1방향은 사이즈가 1이므로

min(find(size(A)~=1)) = 2 % 값이 하나 밖에 없으므로 2를 리턴하고 최종결과는

2방향이 된다.

2nd Semester, 2005

dim = min(find(size(x)~=1));

이제 왜 이렇게 복잡하게 쓰는지를 어는 정도 이해할 수 있다. 만약 3차원에 있는

어떤 벡터가 (1x1x10)의 사이즈를 가지고 있고, 평균값을 구하는 함수가 항

상 방향을 명시해야 한다면 이의 경우는

>> mean(A,3)

이라고 항상 써야 하고 이는 불편하기 그지 없다. 따라서 처음으로 사이즈가 1이 아

닌 방향을 찾아서 평균을 구하는 것이 논리적으로 맞다는 것이다.

만약 A 가 (1x10x5)의 크기를 갖는 행렬이라면

>> mean(A)

의 결과값의 사이즈는? ( x x )

함수의 내용 (implementation)

2nd Semester, 2005

함수의 내용 (implementation)function y = mean(x,dim)

if nargin==1,

우리가 함수을 선언할 때, 이 함수는 두개의 input변수를 필요로 한다. 하지만 함수

안에서 한개만 넣어도 되는 경우를 처리하고 있으면 한개만 넣어도 된다.

그것이 첫번째에 나오는 nargin==1 의 부분이다. 이 말은 input 변수가 하나 뿐일

때, 즉 x 뿐일때 어떻게 계산을 수행하는가를 묻는 말이다.

이 경우를 잠시 생각해 보자.

Case 1: x=[1, 2, 3, 5] (행벡터). 이 경우 user는 이 네개 값의 평균을 원할 것 이다.

Case 2: x=[1, 5, 7, 9]’ (열벡터). 이 경우도 이 네개 값의 평균을 원할 것 이다.

Case 3: x=[1 2 ; 4 5] (행렬). 이 경우 평균을 구하는 방법은 두 가지가 있다는 방법

을 우리는 배웠다. (1 방향, 2 방향). 그래서 방향을 정하지 않은 경우는 1 방향이라고 가정한다.

물론, if 문을 써서 각각의 경우에 방향을 정해주면 되지만 이것을 간단히 하면,

2nd Semester, 2005

함수의 내용 (implementation)if isempty(dim), dim = 1; end

위에서 우리는 평균을 구하는 방향을 정했는 데, 또 방향을 구하는 하나의 명령문이 들어가 있다. 이 경우는 어떤 경우인가?

만약 user가 input변수로 사이즈가 0인 변수를 input으로 넣었다고 하자. 사이즈가0인 변수가 과연 어떻게 존재하는 가?

>> A=ones(0,0)과 같은 경우가 해당되는데 이와 같은 문을 쓰는 user는 없다. 하지만 우리가 어떤

계산을 수행하였는데 결과가 없을 때 매트랩은 공집합, 즉 사이즈가 0인 변수를 리턴한다. 만약 우리가 그 결과를 평균함수에 대입하는 경우가 가장 빈번히 발생하는 경우이다. 따라서 이 경우도 처리를 해주어야 하는데 여기서는isempty()라는 함수를 쓴다. 만약 크기가 0인 변수의 경우 이 함수값은 1이된다. 그 경우 위의 dim = min(find(size(x)~=1)); 는 0의 방향을 리턴하므로 우리는 이 경우를 1의 방향으로 명시할 필요가 있다.

9

2nd Semester, 2005

함수의 내용 (implementation)if nargin == 1

y = sum(x)/size(x,dim);else

y = sum(x,dim)/size(x,dim);end

그 다음으로 넘어가 보자. 이제 우리는 user가 방향을 지정하지 않은 경우 방향을모두 구했다. 따라서 평균값은 y = sum(x)/size(x,dim); 와 같이 모든 값을 더해서 그 갯수로 나누어 주면 된다.

User가 방향을 정한 경우는 그 방향으로 합을 구하고, 그 방향으로의 갯수 (사이즈)로 나누어 주면 이 함수의 기능은 끝이 난다.

이제 만약 크기가 0인 값을 input변수로 넣었을 경우를 다시 생각해 보면, 그 방향은 앞에서 1로 잡았다. 그런데 이 값들의 합도 0이고 갯수도 0이므로 결국0/0의 꼴이 되어서 error가 생긴다. 이러한 error도 이 함수가 처리해야 하는가는 함수를 만든 사람의 생각에 따라 다르다. 현재 매트랩함수 mean()은 이경우에 divided-by-zero error를 낸다.

2nd Semester, 2005

If-else-end 문과 Loop 문실제로 하나의 함수을 만들어 보기 전에 알고리듬의 기본이 되는 두가지 구조 – 조

건문 (if) 과 루프반복에 대해서 간단히 배워보자.

조건문 (if-else-end)계산식이 조건등에 따라 틀려질 경우 if문을 쓰게 되는데, 다른 언어에서와 같이 그

구조는 비슷한다. 하지만 matlab 의 경우는 반드시 end로 그 조건식을 끝내야 한다.

if(a>0)if(a>=1)

a=a*100;else

a=a*50;end

elseif(a==0)a=0;

elsea=-50*a;

end

2nd Semester, 2005

If-else-end 문과 Loop 문다음은 반복계산을 하는 경우를 예로 들어보자. Fortran에서는 do-loop를 많이 쓰는

데 매트랩에서는 for-loop가 표준이다.다음의 예는 100개의 x값에 대해서 그 값은 로그값의 사인값을 구하는 loop의 예제

이다.

y=zeros(1,100);for i=1:100

y(i) = sin( log (x(i)) );end

많은 경우에 매트랩의 벡터나 행렬 operator를 이용해서 loop를 없앨 수가 있는데이 방법이 계산시간이 적게 걸리므로 장려되는 방법이다.

y=sin( log (x) );

는 앞의 루프를 이용한 식과 같은 결과를 제공한다.그리고 while()문이 라는 것도 있는데 while(조건)-end 사이에 있는 것을 조건이 참

인 동안 반복실행한다.

2nd Semester, 2005

함수 만들기 – 예제 (벡터의 내적)여기에서는 실제로 함수를 만들어 보기로 하자.

여러분들이 잘 아는 벡터의 내적을 구하는 프로그램을 짜보기로 하자.

실제 함수를 만들기 전에 우리가 알아야 할 것들을 나열해 보면,

(1) Input 변수는 몇 개이어야 하는가?

(2) 벡터의 내적 계산이 정상적으로 수행되기 위해선 어떤 조건이 필요한가?

(3) 리턴해야 할 변수가 있는가? 있다면 그 사이즈는 얼마인가?

(4) 특수하게 다루어야 할 경우가 어떤 것들이 있을까?

2nd Semester, 2005

벡터의 내적을 구하는 함수

여기에서는 실제로 함수를 만들어 보기로 하자.

여러분들이 잘 아는 벡터의 내적을 구하는 프로그램을 짜보기로 하자.

실제 함수를 만들기 전에 우리가 알아야 할 것들을 나열해 보면,

(1) Input 변수는 몇 개이어야 하는가?

(2) 벡터의 내적 계산이 정상적으로 수행되기 위해선 어떤 조건이 필요한가?

(3) 리턴해야 할 변수가 있는가? 있다면 그 사이즈는 얼마인가?

(4) 특수하게 다루어야 할 경우가 어떤 것들이 있을까?

2nd Semester, 2005

벡터의 내적을 구하는 함수

function c=dot(a, b) % Inner product of two vectors% ……

if( length(find(size(a)~=1)) >1 |length(find(size(b)~=1)) >1 )

disp(“Input parameters should be vectors”);endif( length(a) ~= length(b) )

disp(“Two vectors should have the same size”);end

c=0.0for i=1:length(a)

c=c+a(i)*b(i); 또는 c= a(:)’ * b(:);end

10

2nd Semester, 2005

Review on Functions/Parameters covered

edit(), nargin, find(), isempty(), if-elseif-else-end, for-end, while

length(), disp(), sqrt(), input()

위의 함수 중 알지 못하는 것은 help를 이용하여 익히기 바람.

그리고 조건문 중에서 switch 문의 구조도 익히기 바람.

2nd Semester, 2005

m-file revisited

앞에서 배웠던 m-file의 경우는 함수를 정의하고 그 알고리듬을 프로그래밍하는 방

법이다.

m-file 은 꼭 함수(function)일 필요는 없다. 단순히 명령어 들의 나열로도 실행이 가

능하다 (script file).

<예>

% sine 함수를 plot 하는 script

t=linspace(0,8*pi,2000);

plot(t, sin(t), ‘r’);

axis([0 8*pi -1.5 1.5]); grid on

xlabel(‘Time’), ylabel(‘sin(Time)’)

title(‘Sine Function’) 0 5 10 15 20 25

-1.5

-1

-0.5

0

0.5

1

1.5

Time

sin(

Tim

e)

Sine Function

2nd Semester, 2005

m-file revisited

하지만 앞의 경우에 있어선 입력변수가 없으므로 여러가지 다른 경우에 반복계산

을 하기가 매우 불편하다. 만약 우리가 시간의 시작값과 끝 값을 바꾸고 싶다

면 다음과 같이 함수를 만들면 된다.

function sineplot(sTime, eTime)

t=linspace(sTime, eTime, 2000);plot(t, sin(t), 'r'); axis([sTime, eTime, -0.5, 1.5]); grid onxlabel('Time'), ylabel('sin(Time)'), title('Sine Function')

>> sineplot(0, 4*pi) 0 2 4 6 8 10 12-1.5

-1

-0.5

0

0.5

1

1.5

Time

sin(

Tim

e)

Sine Function

2nd Semester, 2005

수치 알고리듬의 implementation

수식으로 주어지는 알고리듬을 계산하는 예제를 몇 가지 살펴보자.

(예제 1) 기울기가 a 이고 y절편이 b인 직선을 [x1 x2] 구간에서 도시하는 매트랩

프로그램을 작성하라.

ezplot이나 symbolic math를 이용해서 analytic하게 그림을 그리는 경우도 있겠지만, 많은 경우 수치해석에서는 많은 점들을 이어 그려서 연속된 함수의 그래프를

완성한다.

이 점들은 (x, y)와 같이 주어진 다는 사실은 우리는 알고 있다. 독립변수인 x를 어

떤 구간에서 정의하고 y값은 직선의 방정식을 이용해서 구해보자. 위의 직선

의 방정식은 y = ax + b 이다.

x = linspace(x1, x2, 2000);

y = a*x + b;

2nd Semester, 2005

수치 알고리듬의 implementation

그리고 이 좌표들을 plot으로 도시하면 된다.

plot(x, y)

이를 정리해서 함수로 만들면, 리턴하는 변수는 필요없고 입력변수는 4개 (기울기, 절편, x 시작값, x 끝값) 가 된다.

function drawLine(a, b, x1, x2)

x=linspace(x1, x2, 2000);

y=a*x1 + b;

plot(x, y); grid on

xlabel(‘x’), ylabel(‘y’)

>> drawLine(2, -1, -10, 10) -10 -8 -6 -4 -2 0 2 4 6 8 10-25

-20

-15

-10

-5

0

5

10

15

20

x

y

2nd Semester, 2005

수치 알고리듬의 implementation

(예제 2) 반지름이 r 이고 그 중심이 (x1, y1)인 원을 도시하는 매트랩 프로그램을

작성하라.

일단 우리는 원의 방정식을 알고 있다.

하지만 이 경우 x와 y의 범위를 구하기가 어려우므로, 극좌표계를 쓰는 것이 훨씬

효과적이다.

중심이 (0, 0)이고 반지름이 r인 원의 방정식을 각(θ)으로 표현하면,

222 )1()1( ryyxx =−+−

)sin()cos(

θθ

ryrx

==

r

θ

)sin,cos( θθ rr

11

2nd Semester, 2005

수치 알고리듬의 implementation

중심을 (x1, y1)으로 이동하는

것은 단지 평행이동이기 때문에,

그러면, 우리는 원의 x와 y의 좌표를

각으로 표현할 수 있다.

theta = linspace(0, 2*pi, 2000);

x = r * cos(theta) + x1;

y = r * sin(theta) + y1;

1)sin(1)cos(

yryxrx

+=+=

θθ

r

θ

)1sin,1cos( yrxr ++ θθ

(x1, y1)

2nd Semester, 2005

수치 알고리듬의 implementation

앞의 내용을 함수로 정리하면,

function plotCircle(r, x1, y1)

theta = linspace(0, 2*pi, 2000);

x = r * cos( theta) + x1;

y = r * sin( theta) + y1;

plot(x, y), grid on

axis image

xlabel('x'), ylabel('y')

>> plotCircle(6, 2, 5)

-2 0 2 4 6 8

0

1

2

3

4

5

6

7

8

9

10

x

y

2nd Semester, 2005

수치 알고리듬의 implementation

앞의 함수의 경우 원의 경계가 Axis의 경계와 맞물려 보기가 좋지 않으므로 axis의최대, 최소값을 조정할 필요가 있다.

function plotCircle(r, x1, y1)

theta = linspace(0, 2*pi, 2000);x = r * cos( theta) + x1;y = r * sin( theta) + y1;plot(x, y), grid onaxis imagexlabel('x'), ylabel('y')

axis( [min(x)-1, max(x)+1,…

min(y)-1, max(y)+1] )

>> plotCircle(6, 2, 5)

-4 -2 0 2 4 6 8

0

2

4

6

8

10

x

y

2nd Semester, 2005

복잡한 수식을 가진 함수 - Viscoelasticity

지각의 구성물 (암석, 토양)이 완전 선형 탄성체이면 매질에 주어진 응력과 그 응력

으로 인한 변형률은 선형으로 연관된다. 그 경우 우리가 잘 아는 탄성파의 속

도는

가 된다 (M 과 μ는 암석의 탄성계수이다). 하지만 실제 암석은 응력을 작용했을 때

일부는 열에너지로 소멸된다. 이는 마치 암석이 유체처럼 점도를 가진 것 처

럼 행동하는 것으로 해석될 수 있다. Elasticity (탄성이론)에서 이러한 효과를

첨가한 것이 Viscoelasticity(점성탄성이론)이며, 여러가지 모델이 있지만 표

준선형고체(Standard linear solid) 모델을 많이 쓴다.

,,ρμ

ρ== sp VMV

E1

E2

η

2nd Semester, 2005

앞의 그림과 같이 스프링과 데시팟(dashpot – 출입문등에 문이 갑자기 닫히지 않게

하기 위해 붙여 놓는 장치)의 조합으로 이루어진 모델은 응력이 어떻게 작용

하는 가에 따라 그 반응이 달라진다. 가령 우리가 이 모델을 빠른 속도로 당

긴 다고 하면 데시팟은 잘 움직이지 않아서 탄성이 전혀 없는 벽처럼 반응할

것이다. 반면에 우리가 매우 느린 속도로 이 모델을 당길 경우 데시팟은 저항

이 거의 없이 움직이기 때문에 이 계는 두개의 스프링만 있는 모델처럼 행동

할 것이다.

이 말을 다시 풀이하면 우리가 매질을 어떻게 진동시키는 가에 따라서 그 반응이

달라진다, 즉 매질의 탄성파의 전파속도가 달라진다는 말이 된다.

일반적으로 매질을 빠르게 진동시키는 경우, 즉 탄성파의 주파수가 높은 경우 탄성

파의 속도는 빨라진다. 이렇게 주파수가 달라짐에 따라 탄성파의 속도가 변

하는 것을 dispersion(파의 분산)이라고 한다.

그리고 또 하나의 현상으로 이러한 매질을 진행할 때 파는 그 에너지를 잃어 버린

다. 이를 파의 감쇄 (attenuation)이라고 한다.

복잡한 수식을 가진 함수 - Viscoelasticity

2nd Semester, 2005

앞의 결과를 자세히 이야기 하기는 너무 복잡하므로, 다음 요약된 그림으로 보면 x축은 주파수이고 두개의 그래프는 탄성계수와 감쇄계수(1/Q)이다. 탄성파의

속도는 탄성계수에 비례하므로 주파수가 커지면 속도가 커진다. 한편 감쇄는

공명주파수 주위에서 제일 크다. 공명주파수는 암석의 속도변화가 가장 큰

곳이다.

복잡한 수식을 가진 함수 - Viscoelasticity

12

2nd Semester, 2005

앞의 내용을 적당한 근사를 이용해서 수식으로 풀어보면 다음과 같은 식을 갖는다. 참고로 감쇄가 일어나는 경우 탄성계수는 복소수가 되는 데 이것의 실수성분

을 Re[], 허수 성분을 Im[]로 표시한다.

복잡한 수식을 가진 함수 - Viscoelasticity

M(ω) =E2 E1 + iωη( )E1 + E2 + iωη =

M∞ M0 + iωωr

M0 M∞

⎛ ⎝ ⎜

⎞ ⎠ ⎟

M∞ + iωω r

M0 M∞

ωω

ωω

ρω

ddV

VVV

MM

Q

MV

g2

11)](Im[)](Re[1

)](Re[

−=

=

=

2nd Semester, 2005

복잡한 수식을 가진 함수 - Viscoelasticity

앞의 수식을 M0가 1, M∞가 4, 밀도가 1이라고 하면 다음과 같은 그림이 나온다. 이제 우리는 이것들을 입력변수로 해서 이 그림을 그리는 함수를 만들어 보자.

ω/ωr

2nd Semester, 2005

복잡한 수식을 가진 함수 - Viscoelasticity

그림에서 보듯이 우리의 독립변수 (x) 는 ω/ωr 이다. 따라서 우리는 이 값을omega라고 하자. 그림에서 보듯이 이 주파수는 로그스케일로 그려져 있다. 그래서 linspace대신에 logspace를 이용해 보자.

omega = logspace(-2, 2, 10001); %0.01에서 100까지

다음은 이 각각의 값에 대해서 일단 M을 계산해야 한다. 입력변수 M0, M∞를 M0, Minf라고 하자.

M = Minf * ( M0 + i*omega*sqrt(M0*Minf) ) ./ ( Minf + i*omega*sqrt(M0*Minf) );

이렇게 하고 나면 omega와 그 길이가 같은 M벡터가 가 생겼다. 이 벡터는 복소수임에 주의하라. 우리가 구해야 하는 속도, 감쇄계수는 M의 함수로

V = sqrt( real(M) ./ density );Qinv = imag(M) ./ real(M);

이제 탄성파의 그룹속도 만이 남았다. 그런데 이 수식에는 아직 우리가 배우지 않은 미분값이 들어 있다.

2nd Semester, 2005

복잡한 수식을 가진 함수 - Viscoelasticity

앞의 그룹속도 (Vg)를 정리해 보면,

미분값을 수치적으로 구하기 위해 diff()라는 함수를 이용하는데, 다음 그림과 같

이 유한차분법(finite-difference)의 일종이다.

ωω

ddVV

VVg

−=

2

f1

x1

)()(

12

12

1xxff

dxdf

xat −−≈

=

diff(f) = [f2-f1, f3-f2, f4-f3, f5-f4, f6-f3]

주의할 점은 벡터의 길이가 하나 준다는

사실이다. 이는 미분이 기울기이고

기울기는 두 점이 필요하므로 당연

한 결과이다.

f2

x2

f3

x3

f5

x5

f4

x4

f6

x6

2nd Semester, 2005

복잡한 수식을 가진 함수 - Viscoelasticity

그래서 diff()를 써준 후에 마지막 값을 하나 더해야 만 우리가 원하는 길이의 벡터

를 구할 수 있다. 한가지 주의 할 점은 여기서 Δx 는 omega의 차이인데, 우리가 logspace를 썼기 때문에 이것이 일정하지 않다는 사실이다. 따라서 x축 값의 차이를 각각 계산해야 한다.

dV = diff(V);

dV = [dV dV(end)]; % 성분 하나를 더한다.

dOmega = diff(omega);

dOmega = [dOmega dOmega(end)];

dVdw = dV ./ dOmega;

Vg = (V .* V) ./ ( V – omega .* dVdw);

주의 할 점은 연산자들이 모두 각각의 성분값의 연산으로 주어진 다는 것을 명심

해야 한다.

2nd Semester, 2005

복잡한 수식을 가진 함수 - Viscoelasticity

정리하여 함수를 만들어 보자.

function plotViscoElas(M0, Minf, density)

omega = logspace(-2, 2, 10001);M = Minf * ( M0 + i*omega*sqrt(M0*Minf) ) ./ ( Minf + i*omega*sqrt(M0*Minf) );V = sqrt( real(M) ./ density );Qinv = imag(M) ./ real(M);dV = diff(V);dV = [dV dV(end)];dOmega = diff(omega);dOmega = [dOmega dOmega(end)];dVdw = dV ./ dOmega;Vg = (V .* V) ./ ( V – omega .* dVdw);semilogx(omega, V, 'b'), hold onsemilogx(omega, Qinv, 'r'), semilogx(omega, Vg, 'k:')legend('V','1/Q','Vg')xlabel('{\omega} / {\omega}_r')ylabel('Value')

13

2nd Semester, 2005

복잡한 수식을 가진 함수 - Viscoelasticity

>> plotViscoElas(1,4,1)

10-2 10-1 100 101 1020

0.5

1

1.5

2

2.5

ω / ωr

Val

ue

V1/QVg

2nd Semester, 2005

구간에 따라 함수가 다른 경우

다음과 같은 함수가 있다고 하자.

주어진 구간 [0, 5π/4] 에서 이 함수를 그리는 m-file을 작성하라.

x =linspace(0, 5*pi/4, 1001);

y = zeros( size(x) );

for i=1:length(x)

if(x(i)<pi/2) y(i)=sin( x(i) );

elseif(x(i)<pi) y(i)=2-cos( x(i) - pi/2 );

else y(i)=2+tan(x(i)-pi );

end

end

plot(x,y)

45:)tan(2

2:)

2cos(2

20:)sin(

πππ

πππ

π

<≤−+=

<≤−−=

<≤=

xxy

xxy

xxy

2nd Semester, 2005

구간에 따라 함수가 다른 경우

하지만 각각의 성분마다 if를 써서 계산하는 것은 매우 비효율적이다.x =linspace(0, 5*pi/4, 1001);

y = zeros( size(x) );

y(x<pi/2) = sin( x(x<pi/2) );

y(x<pi & x>=pi/2) = 2-cos( x(x<pi & x>=pi/2) - pi/2 );

y(x>=pi) = 2+tan( x(x>=pi) - pi);

plot(x,y)

이보다 더 좋은 방법은 논리곱을 이용하는 방법이다.x =linspace(0, 5*pi/4, 1001);

y = sin(x) .* (x<pi/2) + ( 2-cos(x-pi/2) ).*(x>=pi/2 & x<pi) + (2+tan(x-pi)).*(x>=pi);

plot(x,y)

2nd Semester, 2005

m-file 추가 예제

이 문제에서는 우리가 과제에서 다루었던 문제를 이용해서 m-file 을 만들어 보자.

(과제 #2의 6번 문제)

• 5개의 컬럼으로 구성된 ASCII 데이타가 주어지고 그 파일이름을 입력변수로

한다.

• 각각의 컬럼은 x좌표, y좌표, 비소, 카드늄, 납의 농도이다.

• 함수가 행해야 할 기능은 (1) 빠진 데이타를 찾아서 그 데이타를 주어진 데이

타 들에서 모두 제거하기, (2) 각 농도의 평균 및 분산값 계산하기, (3) 각 농

도들간의 상관관계 계산하기, (4) 각 농도들을 격자화 자료로 만들기, (5) 각농도들의 면구조를 surf를 이용해 출력하기 (subplot을 이용해 세가지 그래프

를 한 그림에서 출력), (6) 또 다른 그림을 그리는 데 카드늄의 농도로 surf 그래프를 그리되, 그 높이를 나타내는 칼라는 납의 농도를 이용하기.

2nd Semester, 2005

함수의 정의

먼저 우리는 입력변수 및 출력변수가 무엇인지 파악해야 한다.

입력변수 : 데이타 파일의 파일 이름 (string type)

출력변수 : 각 농도의 평균값, 분산, 그리고 상관관계

출력변수를 각각의 값으로 출력하려면, 9개의 변수가 필요해 너무 복잡해 지므로

평균, 분산, 상관관계를 벡터 및 행렬로 하여 3개로 만드는 것이 좋다.

그러면 함수의 선언부분이 정해진다. 편의상 함수의 이름은 hw2prob6으로 하자.

function [ m, sd, ccoef ] = hw2prob6( filename )

2nd Semester, 2005

데이타 파일 읽기와 빠진 데이타 제거

첫번째 수행해야 할 일은 데이타를 읽는 것이다.

데이타는 ascii 파일로 포맷이 우리가 원하는 데로 주어져 있다고 가정하자.

data = load( filename );

그 다음은 이 데이타들 중에 빠진 데이타를 제거해 보자. 빠진 데이타들은 1030 이

라는 값으로 항상 주어진 다고 가정하자. 과제에 주어진 데이타는 비소의 농

도에만 빠진 데이타가 있었지만 일반적으로 모든 데이타에서 일어날 수 있으

므로 모든 데이타를 다 비교해야 한다.

ind = find( data(:,3) < 10^20 & data(:,4) < 10^20 & data(:,5) < 10^20 );

data2 = data( ind, : );

14

2nd Semester, 2005

평균, 분산, 그리고 상관계수 구하기

빠진 데이타를 제거한 이후에 평균, 분산, 그리고 상관계수를 구해보자.

출력변수들을 m, sd, ccoef 로 이미 정해 놓았으므로 이 변수들을 써야 한다.

m = mean( data2( :, 3:5) );

sd = std( data2( :, 3:5) );

ccoef = corrcoef( data( :, 3:5) );

물론 위와 같이 하지 않고 각각의 농도값들을 다른 변수로 지정해서 각각 평균, 표준편차, 상관계수들을 구해도 된다. 하지만 이렇게 구하는 것이 함수가 보다

간단해 진다. 이는 프로그래머의 선택에 달려있다.

평균과 분산은 그 방향을 지정하지 않은 경우 컬럼방향으로 평균을 구한다는 사실

을 이미 배웠다. 이는 우리가 원하는 방향이므로 따로 방향을 지정해 주지 않

아도 된다. 상관계수의 경우도 행렬을 입력변수로 넣는 경우 각 컬럼들의 상

관계수를 구하므로 이 또한 우리가 원하는 바이다.

2nd Semester, 2005

격자화 자료 구하기

이제 그래프를 그리기 위해서 격자화 자료를 만들어 보자. 앞에서 배웠듯이 격자화

자료를 만들기 위해서 먼저 격자화된 좌표 (x1, y1)을 먼저 만들어야 한다.

그리고 격자화된 좌표의 갯수가 원래 좌표들의 갯수와 비슷한 것이 좋다. 격자좌표

의 갯수를 먼저 구해 보자.

원래의 좌표들의 갯수는

ndata = length( data2(:,1) );

그리고 x와 y의 좌표들의 최대 최소값은

minx = min( data2(:,1) ); maxx = max( data2(:,1) );

miny = min( data2(:,2) ); maxy = max( data2(:,2) );

그래서 데이타가 들어가는 box의 크기는

lx = (maxx - minx); ly = (maxy - miny);

만약 lx에 nx의 데이타가 들어가면 ly에는 nx*(ly/lx) 만큼의 데이타가 들어간다.

따라서 총갯수는 nx*nx*ly/lx 가 되고 이 갯수는 원래 데이타의 갯수와 비슷해야 한

다.

격자화 자료 구하기

앞의 결과를 종합하면

nx = sqrt( ndata * lx / ly);

가 되는데, 이것은 갯수이므로 반드시 양의 정수가 되어야 한다. 따라서

nx = round ( sqrt( ndata * lx / ly) );

ny = round ( nx * ly / lx );

문제가 조금 복잡해 지긴 하지만, 우리는 한가지 더 생각해야 할 일이 있다. 아까 구

한 box의 경계에서는 데이타 없어서 griddata를 이용할 경우 그 값을 정하지

못하는 경우가 있다는 것을 배웠다. 그래서 우리는 아래 그림과 같이 격자데

이타를 구하려고 한다.

dx = lx / (nx+1);

x = [minx+dx/2 : dx : minx+dx*nx + 2*dx/3];

minx maxxnx

??

2nd Semester, 2005

격자화 자료 구하기

y 의 경우도 마찬가지지만 우리는 등간격을 이용하기로 했으므로 (dx=dy) y축의

격자데이타는 다음과 같이 주어진다.

y = [miny+dx/2 : dx : miny+dx*ny + 2*dx/3];

[x1, y1] = meshgrid(x, y);

이제 격자데이타의 x, y좌표가 주어졌으므로 각각의 격자자료를 구해보자.

as = griddata( data2(:,1), data2(:,2), data2(:,3), x1, y1);

cd = griddata( data2(:,1), data2(:,2), data2(:,4), x1, y1);

pb = griddata( data2(:,1), data2(:,2), data2(:,5), x1, y1);

2nd Semester, 2005

surf() 를 이용한 plot 이제 모든 자료가 구해졌고, 이를 이용해 단지 plot을 하면된다.

figure;

subplot(3,1,1); surf(x1, y1, as);

xlabel('X'); ylabel('Y'); title('Arsenic');

shading interp; camlight; lighting phong; axis tight

subplot(3,1,2); surf(x1, y1, cd);

xlabel('X'); ylabel('Y'); title('Cadnium');

shading interp; camlight; lighting phong; axis tight

subplot(3,1,3); surf(x1, y1, pb);

xlabel('X'); ylabel('Y'); title('Lead');

shading interp; camlight; lighting phong; axis tight

2nd Semester, 2005

surf() 를 이용한 plot 마지막은 또 다른 그래프를 그려서 카드늄의 농도로 surface를 그 높이 color는 납

의 농도로 표시하는 것이다.

figure;

surf(x1, y1, cd, pb);

xlabel('X'); ylabel('Y'); title('Cadnium');

shading interp; camlight;

lighting phong; axis tight

colorbar

15

2nd Semester, 2005

결과 m 파일function [ m, sd, ccoef ] = hw2prob6( filename )

data = load( filename );ind = find( data(:,3) < 10^20 & data(:,4) < 10^20 & data(:,5) < 10^20 ); data2 = data( ind, : );

m = mean( data2( :, 3:5) );sd = std( data2( :, 3:5) );ccoef = corrcoef( data( :, 3:5) );

ndata = length( data2(:,1) );minx = min( data2(:,1) ); maxx = max( data2(:,1) );miny = min( data2(:,2) ); maxy = max( data2(:,2) );lx = (maxx - minx); ly = (maxy - miny);nx = round ( sqrt( ndata * lx / ly) );ny = round ( nx * ly / lx );dx = lx / (nx+1);x = [minx+dx/2 : dx : minx+dx*nx + 2*dx/3]; y = [miny+dx/2 : dx : miny+dx*ny + 2*dx/3];[x1, y1] = meshgrid(x, y);

as = griddata( data2(:,1), data2(:,2), data2(:,3), x1, y1);cd = griddata( data2(:,1), data2(:,2), data2(:,4), x1, y1);pb = griddata( data2(:,1), data2(:,2), data2(:,5), x1, y1);

2nd Semester, 2005

결과 m 파일 - 계속

figure;subplot(3,1,1); surf(x1, y1, as);xlabel('X'); ylabel('Y'); title('Arsenic'); shading interp; camlight; lighting phong; axis tightsubplot(3,1,2); surf(x1, y1, cd);xlabel('X'); ylabel('Y'); title('Cadnium'); shading interp; camlight; lighting phong; axis tightsubplot(3,1,3); surf(x1, y1, pb);xlabel('X'); ylabel('Y'); title('Lead'); shading interp; camlight; lighting phong; axis tight

figure;surf(x1, y1, cd, pb);xlabel('X'); ylabel('Y'); title('Cadnium'); shading interp; camlight; lighting phong; axis tightcolorbar

2nd Semester, 2005

Fourier Transform (푸리에 변환)푸리에 변환이란 무엇인가?

쉽게 말하면 시계열 (time series)의 주파수 영역으로의 mapping이다. 예를 들어서

시간에 변화에 따른 해수 높이의 변화를 측정했다고 하자. 우리가 알고 있는

조석의 변화를 생각해 보면 이 시계열은 아마도 12 시간 정도의 주기를 가지

고 있다는 사실을 유추해 볼 수 있다.

0 50 100 150 200 250 300 350 4005

10

15

20

Day

Hei

ght

0 1 2 3 4 5 6 7 85

10

15

20

Day

Hei

ght

2nd Semester, 2005

1.88 1.9 1.92 1.94 1.96 1.98-5

0

5

x 104

1/day

Rea

l am

plitu

de-15 -10 -5 0 5 10 15

-5

0

5

10x 10

5

1/dayR

eal a

mpl

itude

FT of time series

0 1 2 3 4 5 6 7

x 10-3

0

2

4

6

8

x 105

1/day

Rea

l am

plitu

de

Fourier Transform (푸리에 변환)앞의 시계열 데이타를 푸리에

변환한 결과가 오른 편

에 나타나 있다.

여기로 부터 무엇을 알 수 있

는가?

1. 주기가 0인 데이타 : 백그라

운드 데이타

2. 주파수가 0.0027 (1/day)인데이타: 이는 주기가 약

365일인 데이타

3. 주파수가 1.92 (1/day)인 데

이타: 주기가 약 0.53, 즉 12시간 50분인 데이

타 - 실제 조석

2nd Semester, 2005

0 2 4 6 8 10-1

-0.5

0

0.5

1cos(2πt)

-4 -3 -2 -1 0 1 2 3 4-100

0

100

200

300

400

500

FT cos(2πt)

기본 지식

시간(주기) 주파수

sec, day hertz, 1/day…

공간(파장) 파수

m, micron 1/m, 1/micron

예를 들어 cos(2πt) 함수의 경우를 살펴보자.

이 함수는 주기가 1인 함수이므로 푸리에 변환

을 하여 주파수 도메인에서 살펴보면 그

에너지가 주파수가 1인 경우(1/1)에만 존

재하고 나머지는 전부 0이다.

2nd Semester, 2005

기본 지식

그렇다면 시계열 함수가 두가지의 주기를 가지

는 함수로 구성된다면 어떻게 될까?

오른쪽에서 보듯이 이제 시계열 함수가 주기가

1인 코사인과 주기가 2 인 코사인의 합으

로 주어진다.

이를 푸리에 변환을 하면 주파수가 1인 부분과

주파수가 0.5 (=1/2)인 부분에서 그 에너

지를 가지고 나머지에서는 0이다.

다시 말하면 푸리에 변환을 하면 그 시계열이

가지는 에너지의 주된 주파수 성분을 알

수 있다.

* 주기 : 반복이 일어나는 시간차이.

cos(2πt) : t가 0일때의 값이 1일때 반복된다.

cos(πt) : t가 0일때의 값이 2일때 반복된다.

0 2 4 6 8 10-1.5

-1

-0.5

0

0.5

1

1.5

2cos(2πt) + cos(πt)

-1 -0.5 0 0.5 1 1.50

100

200

300

400

500FT[ cos(2πt) + cos(πt)]

16

2nd Semester, 2005

푸리에 급수

이러한 푸리에 변환과 푸리에 급수는 어떻게 다른가?

푸리에 급수 (Fourier series)는 우리가 알고 있는 함수로 표현하기 어려운 함수를

우리가 잘 알고 있는 함수들의 합으로 표현하는 방법의 일종으로 sin()함수

와 cos()함수를 이용한다.

다음의 결과가 알려져 있다.

다시 말해서 어떠한 복잡한 함수라고 하더라도 무한개의 사인과 코사인 함수만

있으면 그 각각의 진폭을 조정하면 정확하게 그 함수를 표현할 수 있다는

것이다.

이것이 왜 중요한가? 우리가 어떠한 함수를 얻었을 때 그 함수를 우리가 잘 아는

사인이나 코사인 같은 함수로 근사할 수 있으면 그 함수의 도함수 및 근을

구하는 데 매우 유용하게 쓰일 수 있다.

푸리에 변환은 이렇게 주어진 시계열을 푸리에 급수로 표현했을 때 그 각각의 주

파수가 가지는 에너지의 크기라고 생각할 수 있다.

{ }∑∞

=

+=0

)cos()cos()(n

nn ntbntaty

2nd Semester, 2005

복소수와 극 좌표계

실제로 푸리에 변환을 알아보기 전에 복소수와 극좌표에 대해서 되집어 보기로

한다.

복소수 (Complex number) : z=x+iyx: 실수성분(real part = Re[z])y: 허수성분(imaginary part = Im[z])

이것을 극좌표계(polar coordinate)에서 표시하면,

⎟⎠⎞

⎜⎝⎛==

+=

=

=

xyphase

yxz

ezz

zzi

1

22

tan

)sin,(cos

θ

θθθ

|z|

θ

)sin,cos( θθ zz

Re

Im

2nd Semester, 2005

복소수와 극 좌표계

복소 켤레(complex conjugate)

이를 이용하면 각각의 성분은

Euler formula *note

222 ** yxzzzeziyxz i +==→=−= − θ

izzyzzx

2*,

2* −=+=

2sin

2cos

sincos)sin()cos(sincos

θθ

θθ

θ

θ

θ

θ

θθθθθθ

ii

ii

i

i

ee

eeiie

ie

−=

+=

−=−+−=+=

22cos

)(2)(2 tfitfi eeft−+=

ππ

π

positive frequency

negative frequency

2nd Semester, 2005

푸리에 변환의 정의

Fourier transform of g(t)

t, f : 실수인 독립변수

G(f) : 주파수 도메인에서의 푸리에 변환된 함수 (복소수)

g(t) : 시간 도메인에서의 시계열 함수 (복소수)

Euler formula 를 써서 분해하여 보면 g가 실수라도 G는 복소수가 될 수 있다.

dtetgtgFTfG fti∫∞

∞−

−== π2)()}({)(

dtfttgidtfttg

dtetgfG fti

∫∫

∫∞

∞−

∞−

∞−

−=

=

)2sin()()2cos()(

)()( 2

ππ

π

2nd Semester, 2005

역푸리에 변환의 정의

Inverse Fourier transform of G(f)

t, f : 실수인 독립변수

G(f) : 주파수 도메인에서의 푸리에 변환된 함수 (복소수)

g(t) : 시간 도메인에서의 시계열 함수 (복소수)

Euler formula 를 써서 분해하여 보면 G가 실수라도 g는 복소수가 될 수 있다.

dfefGfGIFTtg fti∫∞

∞−

== π2)()}({)(

dtftfGidtftfG

dtefGfg fti

∫∫

∫∞

∞−

∞−

∞−

+=

=

)2sin()()2cos()(

)()( 2

ππ

π

2nd Semester, 2005

푸리에 변환의 역푸리에 변환

G(f) 가 g(t)의 푸리에 변환이면

라는 결과가 다음이 충분조건일 때 성립한다.

1. g(t) 의 불연속점이 유한개이고

2. g(t) 는 유한구간에서 유한개의 최대, 최소값을 가지며,

3. g(t) 가 절대적으로 적분 가능해야 한다.

참고로 위의 조건은 충분조건이다. 따라서 위의 조건이 충족되면 항상 만족하고

위의 조건이 충족되지 않는 경우에 위의 식이 성립하는 경우도 있다.

{ } { } ousdiscontinu is t if )()(2/1

continuous is t if )()}({)}({

⎩⎨⎧

+== −+ tgtg

tgtgFTIFTfGIFT

17

2nd Semester, 2005

매트랩에서 푸리에 변환

이제 실제로 매트랩에서 푸리에 변환을 시도해 보자. 푸리에 변환을 하는 함수는

fft() 와 ifft()이다. 이 함수는 discrete Fourier Transform을 수행하는 함수로

주어진 것이 시계열이던 공간함수이건 관계없이 푸리에 변환를 한다.

다시 말해서 주어진 시계열이나 공간함수의 간격(dt 또는 dx)을 1로 가정하고 계

산한다. 따라서 주어진 시계열을 푸리에 변환을 하여 주파수계열을 얻었다

면 그 각각의 값들의 위치를 따로 계산해 주어야 한다.

만약 t=[0, 0.2, 0.4,…,2] 이라면, f=[0, 0.5, 1, 1.5,…,5] 이 된다.

tdt

(N-1)dt

f

(N-1)dt1

dt1

2nd Semester, 2005

매트랩에서 푸리에 변환

여기서 우리는 재미있는 사실을 발견할 수 있다.

t=[0, 0.02, 0.04,…,0.2] f=[0, 5, 10, 15,…,50]

따라서 우리가 촘촘히 데이타를 얻으면 주파수 사이의 거리는 넓어진다. 그리고

t=[0, 0.2, 0.4,…,20] f=[0, 0.05, 0.1, 0.15,…,5].

결과적으로 다음의 결론을 얻는다.

1. 주파수 사이의 간격은 시계열의 전체길이가 길수록 짧아 진다.

2. 데이타를 얻을 수 있는 주파수의 대역은 시계열 간격이 길수록 짧아진다.

시간도메인과 주파수 도메인은 서로 반대되는 성질이 있다.

2nd Semester, 2005

나이퀴스트 주파수 (Nyquist f)다음의 사인 함수을 제대로 기술하려면 한 주기당 몇개의 데이타가 필요할까?

아래 그림에서 보듯이 주기당 2개(빨간 원)의 데이타 값만 있을 경우는 제대로

함수를 표시하기 힘들다. 4개(파란 x)인 경우는 상대적으로 잘 표현하고 있

다. 따라서 하나의 주기에 2개의 데이타가 있는 경우보다 더 작은 경우는

그 주파수는 표현이 불가능하다. 이때의 주파수를 나이퀴스트 주파수라 한

다.

-6 -4 -2 0 2 4 6

-1

-0.5

0

0.5

1

x

sin(x)

2nd Semester, 2005

나이퀴스트 주파수 (Nyquist f)

그런데 실제 주파수의 영역은 나이퀴스트 주파수의 두배이다. 하지만 우리는 나

이퀴스트 주파수 다음에는 실제 데이타가 없다는 사실을 알고 있다. 그래

서 나이퀴스트와 그 이후의 값들은 실제로 음의 주파수가 된다. 음의 주파

수가 왜 존재하는가? 이는 푸리에 변환의 수학적 정의 때문에 도출되는 값

으로 물리적으로 의미는 없다.

이러한 작업을 해주는 매트랩 함수가 있는데 이것이 fftshift()이다.

],...,2,1,0[],....,2,,0[

21

ndtn

ndtndtfdtndtdtt

dtfNyq

=→=

=

]1

2,...,2,1,0,1,...,2

12,2[],....,2,,0[

ndt

n

ndtndtndtndt

n

ndt

n

fdtndtdtt−−−+−−

=→=

2nd Semester, 2005

푸리에 변환 매트랩 예제

코사인 함수를 푸리에 변환을 해보자.

t=linspace(0, 12*pi, 1000);

g=cos(t);

dt=t(2)-t(1);

df=1/dt/(1000-1);

f=[-500:499]*df;

G=fft(g);

G=fftshift(G);

subplot(2,1,1)

plot(t, g);

subplot(2,1,2)

plot(f, G);

0 5 10 15 20 25 30 35 40-1

-0.5

0

0.5

1

-0.6 -0.4 -0.2 0 0.2 0.4 0.6 0.8 1-100

0

100

200

300

400

500

2nd Semester, 2005

짝함수(Even) 와 홀함수(Odd)어떤 함수 g(t)가 y축을 중심으로 대칭이면 그 함수는 짝함수(even function)이다.

다시 말하면 g(-t)= g(t) 이다.

어떤 함수 g(t)가 원점을 중심으로 대칭이면 그 함수는 홀함수(odd function)이다.

다시 말하면 g(-t)= -g(t) 이다.

홀함수는 차수가 홀수(1, 3, 5…)인 경우라서 홀함수라고 하고 짝함수는 차수가

짝수(2, 4, 6…)인 함수이라서 짝함수라고 부른다.

-1 -0.5 0 0.5 1-1

-0.8

-0.6

-0.4

-0.2

0

0.2

0.4

0.6

0.8

1

-1 -0.5 0 0.5 10

0.1

0.2

0.3

0.4

0.5

0.6

0.7

0.8

0.9

1

18

2nd Semester, 2005

짝함수와 홀함수의 성질

Theorem

어떠한 함수이든 그 함수는 짝함수와 홀함수의 합으로 표현될 수 있다.

oddtOtEeventOtOeventEtE

dftEdftEdftO

dftEdftEdftO

aa

a

a

a

===

==

==

∫∫∫

∫∫∫

−−

∞∞

∞−

∞−

)()()()()()(

)(2)(;0)(

)(2)(;0)(

21

21

0

0

{ }

)()()()()()}()({2/1)()()()()(2/1)(

tOtEtgtOtOtgtgtOtEtEtgtgtE

+==−←−−==−←−+=

2nd Semester, 2005

짝함수와 홀함수의 이용

다시 푸리에 변환의 정의로 돌아가보자.

홀함수실수

짝함수허수

홀함수허수

짝함수실수

:)()2sin()()(

)2sin()()2sin()()2cos()()()()(

:)()2cos()()(

)2cos()()2sin()()2cos()()()()(

:)()2sin()()(

)2sin()()2sin()()2cos()()()()(

:)()2cos()()(

)2cos()()2sin()()2cos()()()()(

fGdtfttOfG

dtfttOdtfttOdtfttOifGtiOtg

fGdtfttEifG

dtfttEidtfttEdtfttEifGtiEtg

fGdtfttOifG

dtfttOidtfttOidtfttOfGtOtg

fGdtfttEfG

dtfttEdtfttEidtfttEfGtEtg

−=−=−

=+=→=

=−=−

=+=→=

−=−−=−

−=−=→=

=−=−

=−=→=

∫∫∫

∫∫∫

∫∫∫

∫∫∫

∞−

∞−

∞−

∞−

∞−

∞−

∞−

∞−

∞−

∞−

∞−

∞−

∞−

∞−

∞−

∞−

π

πππ

π

πππ

π

πππ

π

πππ

dtetgtgFTfG fti∫∞

∞−

−== π2)()}({)(

Matlab을 이용한 선형 대수 계산

앞에서 우리는 매트랩이 행렬연산을 중심으로 그 개발이 시작되었다는 것을 배웠

다. 그러면 여기서 일반적인 선형 행렬 연산을 매트랩을 이용해서 어떻게 수

행하는 지 몇 가지의 예를 살펴보고자 한다.

벡터와 행렬의 Norm

The p-norm of a vector x

is computed by norm(x,p). This is defined by any value of p > 1, but the most common values of p are 1, 2, and . The default value is p = 2, which corresponds to Euclidean length.

The p-norm of a matrix A,

can be computed for p = 1, 2, and by norm(A,p). Again, the default value is p = 2.

p

i

pip

x/1

⎟⎠

⎞⎜⎝

⎛= ∑x

p

p

p

xp

/1

max⎟⎟

⎜⎜

⎛=

x

AxA

Ax=b 의 풀이

가장 일반적인 선형방정식 Ax=b의 풀이를 생각해 보자.

만약 A 가 (m,n) 의 크기를 가지는 행렬인 경우,

(1) m > n : 주어진 식이 해 보다 많다 (overdetermined). 이 경우에 모든 식을 만족시키는 해가 없는 경우가 이므로, 실제 구해진 해는 차이값 (에러)들의 합을 최소화 하는 해를 구한다.

(2) m = m : 식과 해의 갯수가 일치하는 경우로 이 경우에는 대부분 답을 구할수 있다. 다만 주어진 식들중에서 같은 것이 있는 경우 답이 정할 수 없다.

(3) m < n : 주어진 식이 해보다 적을 경우로 (underdetermined), 하나의 해를 구할 수 없고 관계식이 주어진다.

매트랩에서는 / 이나 \ 연산자를 이용해서 구한다.

Ax=b 의 풀이

만약 행렬 A가 정사각 행렬 (square matrix)인 경우에는 정확한 Ax=b의 풀이는 A의역행렬을 구하여, 양변에 곱하면 된다.x = inv(A) * b;

하지만 행렬 A가 역행렬을 가지지 않는 경우, 다시 말해서 A의 행렬식이 0인 경우, 다시 말해서 A의 행렬의 열들이 모두 서로 독립이 아닌 경우는 역행렬을 가지지 않고 따라서 해는 존재하지 않는다.

그런데 행렬식이 0은 아니지만 아주 0에 가까운 경우를 생각해 보자.

위의 B 의 경우는 수학적으로 역행렬을 가지지만, 실제 컴퓨터에서는 역행렬을 계산할 수도 있고, 못할 수도 있다. 이렇게 행렬이 얼마나 singluar에 가까운 가를 알아보는 데는 condition number 를 쓴다. >> cond(B)

⎟⎟⎠

⎞⎜⎜⎝

⎛=⎟⎟

⎞⎜⎜⎝

⎛=

0000000001.4221

,4221

BA

19

Ax=b 의 풀이

만약 행렬 A에 어떤 행렬 B를 곱했더니 그 결과가 단위 행렬이 되었다고 하자.

당연히 행렬 B는 A의 역행렬이다. 그런데 이렇게 역행렬을 곱하고 나면 미지수 x앞에 있는 행렬이 단위 행렬이 되고 실제 그 해들은 식의 오른 쪽에 있는 Bb가바로 답이 된다.

따라서, 선형방정식의 여러가지 풀이 방법은 행렬A에 어떤 값을 곱해서 그 결과가근사적으로 단위행렬이 되게 하는 것이 그 기본 목적이다.

⎟⎟⎠

⎞⎜⎜⎝

⎛=⎟⎟

⎞⎜⎜⎝

⎛⎟⎟⎠

⎞⎜⎜⎝

⎟⎟⎠

⎞⎜⎜⎝

⎛=⎟⎟

⎞⎜⎜⎝

⎛==

23

1001

23

,1001

,

2

1

xx

BbBAbAx

Eigenvalue and Eigenvector

사각행렬을 다룰 때, 우리는 흔히 고유값과 고유벡터란 용어를 흔히 쓴다.이것이 무엇인지 알아보자.고유값은 어떤 행렬 A가 를 만족시킬 때 그 때의 스칼라값 λ를 고유값 그

리고 벡터 x를 고유 벡터라고 한다.

이렇게 하기 위해서 우리는 A를 고유값 변환이라는 것을 이용해 행렬을 분해하게된다. 그 결과만 제시하면,

여기서 중간에 주어진 행렬은 대각행렬이 된다.그리고 여기서 우리는 한가지의 사실을 알아야 하는데, 벡터의 좌표변환을 기억해

보면, 다음과 같이 된다.

비슷한 방법으로 행렬의 좌표변환을 알아보면 다음과 같이 된다.

xAx λ=

1, −Λ=Λ= VVAVAV

Txx =′

1−=′ TATA

Eigenvalue and Eigenvector

따라서 앞의 결과로 부터, 우리는 A라는 행렬은 대각행렬 Λ을 3차원 좌표변환을 한값이라는 사실을 알 수가 있다.

그러면 이 대각행렬의 성분들은 무엇이 되는가? 그것은 바로 아까 말했던 고유값들이다. 그리고 좌표변환에 이용된 행렬 V는 그 행렬의 고유벡터들의 모임이다.

다시 이를 정리하면 무엇이 되는가? 어떠한 행렬을 고유분해를 하면 (회전변환) 우리는 대각행렬을 얻게 된다. 이 내용은 우리에게 매우 익숙하다. 응력의 경우를 예를 들어 보자. 우리는 응력이 텐서, 다시 말해서 행렬이라는 사실을 알고 있다. 이것을 회전변환을 해서 대각성분만 남는 다는 말은 무엇인가. 응력장의 좌표를 회전시켜서 주응력(대각성분)만 남긴다는 말이다. 다시 말해서우리가 원하는 eigenvalue는 주응력 성분이 되고, eigenvector는 그 주응력 방향이 된다.

매트랩에서 eig라는 명령어가 행렬의 고유치와 고유벡터를 구하는 함수이다.

Eigenvalue and Eigenvector

다음 예제를 살펴보자. 여기서 우리는 (σxx =4 σyy =8 σyx =3.46)이라는 것에서 시작해서 주응력을 구해보자.

x

y

σ = 6 - 4×cos(60°) = 4 MPaτ = 4×sin(60°) = 3.46 MPa

10 MPa

10 MPa

2 MPa2 MPa30°

-60°

(σ, τ)

τ

σ2 10

120°

6

Eigenvalue and Eigenvector

이번에는 고유치와 고유 벡터를 구해서, (σxx =4 σyy =8 σyx =3.46)의 결과로 부터주응력을 계산해 보자.

이 계산은 매트랩에서 eig() 란 함수로 수행할 수 있다.>> [v d]=eig([8 3.46; 3.46 4])v = 0.50 -0.87

-0.87 -0.50d = 2.00 0

0 10.00

2or 10046.3)4)(8(

0446.3

46.380

446.346.38

2

=∴=−−−

=⎟⎟⎠

⎞⎜⎜⎝

⎛−

−⇒=−

⎟⎟⎠

⎞⎜⎜⎝

⎛=

λλλ

λλ

λσ

σ

xxxt

t

Symbolic Math또 다른 매트랩에서 유용한 tool중의 하나는 symbolic math의 기능이다.이는 실제 숫자를 이용하지 않고 문자로 계산하는 방법이다.예를 들어

>> solve( 'a*x^2 + b*x + c = 0', 'x')1/2/a*(-b+(b^2-4*a*c)^(1/2))1/2/a*(-b-(b^2-4*a*c)^(1/2))이는 여러분이 잘 아는 이차방정식의 근의 공식이다. 그러면 3차방정식의 근은? >> solve( 'a*x^3 + b*x^2 + c*x + d = 0', 'x') 1/6/a*(36*b*c*a-108*d*a^2-8*b^3+12*3^(1/2)*(4*a*c^3-c^2*b^2-

18*b*c*a*d+27*d^2*a^2+4*d*b^3)^(1/2)*a)^(1/3)-2/3*(3*a*c-b^2)/a/(36*b*c*a-108*d*a^2-8*b^3+12*3^(1/2)*(4*a*c^3-c^2*b^2-18*b*c*a*d+27*d^2*a^2+4*d*b^3)^(1/2)*a)^(1/3)-1/3*b/a

-1/12/a*(36*b*c*a-108*d*a^2-8*b^3+12*3^(1/2)*(4*a*c^3-c^2*b^2-18*b*c*a*d+27*d^2*a^2+4*d*b^3)^(1/2)*a)^(1/3)+1/3*(3*a*c-b^2)/a/(36*b*c*a-108*d*a^2-8*b^3+12*3^(1/2)*(4*a*c^3-c^2*b^2-18*b*c*a*d+27*d^2*a^2+4*d*b^3)^(1/2)*a)^(1/3)-1/3*b/a+1/2*i*3^(1/2)*(1/6/a*(36*b*c*a-108*d*a^2-8*b^3+12*3^(1/2)*(4*a*c^3-c^2*b^2-18*b*c*a*d+27*d^2*a^2+4*d*b^3)^(1/2)*a)^(1/3)+2/3*(3*a*c-b^2)/a/(36*b*c*a-108*d*a^2-8*b^3+12*3^(1/2)*(4*a*c^3-c^2*b^2-18*b*c*a*d+27*d^2*a^2+4*d*b^3)^(1/2)*a)^(1/3))

-1/12/a*(36*b*c*a-108*d*a^2-8*b^3+12*3^(1/2)*(4*a*c^3-c^2*b^2-18*b*c*a*d+27*d^2*a^2+4*d*b^3)^(1/2)*a)^(1/3)+1/3*(3*a*c-b^2)/a/(36*b*c*a-108*d*a^2-8*b^3+12*3^(1/2)*(4*a*c^3-c^2*b^2-18*b*c*a*d+27*d^2*a^2+4*d*b^3)^(1/2)*a)^(1/3)-1/3*b/a-1/2*i*3^(1/2)*(1/6/a*(36*b*c*a-108*d*a^2-8*b^3+12*3^(1/2)*(4*a*c^3-c^2*b^2-18*b*c*a*d+27*d^2*a^2+4*d*b^3)^(1/2)*a)^(1/3)+2/3*(3*a*c-b^2)/a/(36*b*c*a-108*d*a^2-8*b^3+12*3^(1/2)*(4*a*c^3-c^2*b^2-18*b*c*a*d+27*d^2*a^2+4*d*b^3)^(1/2)*a)^(1/3))

20

Symbolic Math앞에서 보듯이 그 답이 무지하게 복잡하다. 이러한 경우에는 그 식을 다른 변수로

치환할 수 있다.>> sol = solve( 'a*x^3 + b*x^2 + c*x + d = 0', 'x');

그런 후에 a,b,c,d의 값을 정하고 답을 구하고 싶으면,

>> a=1; b=0; c=0; d=-1;>> eval(sol)

1.0000 -0.5000 + 0.8660i-0.5000 - 0.8660i

이 경우 sol 은 식을 가진 symbolic object가 되고, 여기에 값을 대입해 해를 구하고싶을 땐, 각각의 변수에 값을 대입하고 eval()을 이용해서 그 함수를 구하면된다.

Symbolic Math단순히 식을 푸는 것 (solve) 뿐만이 아니라 다른 수식계산과 매트랩에서 가능한데

그 중 몇가지만 살펴보면,

함수의 미분과 적분

>> diff( ‘sin(x)’, ‘x’)cos(x)

>> int('sin(a*x)','x')-1/a*cos(a*x)

>> int('sin(x)','x',0, pi) 2

>> int('sin(a*x)','x',0, pi)-(cos(pi*a)-1)/a