23.01.2014 Visualizzazioni

Matlab Tutorial

Matlab Tutorial

Matlab Tutorial

SHOW MORE
SHOW LESS

Trasformi i suoi PDF in rivista online e aumenti il suo fatturato!

Ottimizzi le sue riviste online per SEO, utilizza backlink potenti e contenuti multimediali per aumentare la sua visibilità e il suo fatturato.

참고도서<br />

<strong>Matlab</strong> <strong>Tutorial</strong><br />

참고도서:<br />

Mastering <strong>Matlab</strong> 7, 2004, Hanselman and Littlefield, Prentice Hall.<br />

Mastering AutoCAD 2005 and AutoCAD LT 2005, 2004, Omura, Sybex.<br />

Autocad 2002, 2002, 김영숙, 세진사.<br />

Prof. Youngseuk Keehm (김영석)<br />

Tel: 041-850-8517<br />

Office: 자연과학관 231<br />

Email: keehm@kongju.ac.kr<br />

조교: 이민희 (245호, 010-6361-4383)<br />

2nd Semester, 2005<br />

2 nd Semester, 2005<br />

What you can do in <strong>Matlab</strong><br />

MATLAB = MATrix LABoratory<br />

1. Elementary function, data analysis, 2D and 3D graphics,<br />

interpolation, grid<br />

2. Signals, Fourier transforms, special functions<br />

3. Least-squares, matrix function, integration, differential functions<br />

4. Statistics, stochastic simulations<br />

5. Image processing, Movie<br />

6. CAD 개요, 좌표계, 기본 도형 및 응용<br />

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

8. 레이어의 이해와 이용<br />

9. 도면배치 및 출력<br />

10. 면구조(Surface)와 렌더링(Rendering)<br />

11. 3차원 면의 재질 및 광원효과<br />

<strong>Matlab</strong> - Introduction<br />

1. Starting <strong>Matlab</strong> – who(s), ls, pwd, cd, diary<br />

2. Datatypes<br />

3. Creating variables<br />

4. Vector/Matrix Variables and Accessing<br />

5. Display format<br />

6. plotting<br />

7. Vector/Matrix operators<br />

8. Max, Min, Mean, Sum<br />

9. Transpose, flip<br />

10. ones, zeros, eye, cascading, extracting<br />

11. load data<br />

12. cell structure<br />

13. Basic matrix calculations<br />

2 nd Semester, 2005<br />

2 nd Semester, 2005<br />

Basics of <strong>Matlab</strong><br />

1. Review of <strong>Matlab</strong> basics<br />

컴퓨터 구조, 파일시스템, OS<br />

who(s), ls, pwd, cd, diary<br />

2. 변수의 선언 – 스칼라, 벡터, 행렬<br />

“help datatypes”<br />

3. 변수들에서 필요한 요소의 추출<br />

4. Vector/Matrix 연산자 들<br />

+ - * .* / ./ \ .\ ^ .^<br />

5. Max, Min, Mean, Sum, Std<br />

Basics of <strong>Matlab</strong> – cont.<br />

6. Transpose, flip<br />

7. ones, zeros, eye, cascading, extracting<br />

8. 매트랩 데이터의 로드와 저장<br />

9. 매트랩 기본 함수들 (elfun)<br />

10. Loop<br />

11. If, else, end 문의 구조<br />

2 nd Semester, 2005<br />

2 nd Semester, 2005<br />

1


파일시스템과 메모리<br />

변수의 선언<br />

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

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

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

으로 C:\<strong>Matlab</strong>7.0\Work라는 디렉토리에서 시작한다. 이것을 변경할 경우<br />

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

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

우는 “ls” 나 “dir”을 사용한다.<br />

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

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

“whos”라는 명령어를 쓴다.<br />

2. 변수의 선언 – 스칼라, 벡터, 행렬, integer, single-precision, double-precision<br />

(“help datatypes” 로 가능한 변수의 타입을 확인할 수 있다.)<br />

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

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

2. 변수의 선언 (계속)<br />

- 변수를 선언하는 방법은 여러가지가 있는데 (1) 파일에서 읽어오는 방법,<br />

(2) 계산식으로 만드는 방법 (3) 초기값을 주고 일단 정의 하는 방법 등이<br />

있다.<br />

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

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

(2) 계산식으로 만드는 방법<br />

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

>> y=sin(x);<br />

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

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

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

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

2 nd Semester, 2005<br />

2 nd Semester, 2005<br />

변수에서 필요한 부분 추출<br />

변수에서 필요한 부분 추출<br />

3. 변수의 추출<br />

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

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

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

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

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

(2) 논리식으로 추출하는 방법<br />

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

>> b = a( a> b = a( find(a> ind1 = a> ind2 = find(a> a = [1 3 -8 9 2 -1 -5];<br />

>> b = a( a>0 & a, =, > c = [ 1 2 -5 4 9 -3 0 -2 4 3 2;<br />

3 -4 1 2 -4 4 1 -8 1 9 -1];<br />

>> d = c( [c(1,:)>0 & c(2,:)> a = [ 1 2 3 4 5 6 7 8 9 10;<br />

0.1 0.4 -0.1 0.2 0.4 0.5 0.6 0.3 0.2 -0.1];<br />

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

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

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

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

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

c를 구하라<br />

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

행렬의 연산<br />

4. Vector/Matrix 연산자 들<br />

+ - * .* / ./ \ .\ ^ .^ 연산자 앞에 마침표가 있는 경우에는<br />

각 요소들 간의 연산으로 정의가 된다.<br />

(예)<br />

⎛ 1 3⎞<br />

⎛0<br />

5 ⎞<br />

A = ⎜ ⎟,<br />

B = ⎜ ⎟<br />

⎝−<br />

2 4⎠<br />

⎝1<br />

− 3⎠<br />

⎛3<br />

− 4⎞<br />

⎛ 0 15 ⎞<br />

A*<br />

B = ⎜ ⎟,<br />

A.*<br />

B = ⎜ ⎟<br />

⎝4<br />

22 ⎠ ⎝−<br />

2 −12⎠<br />

(참고) ⎛ 1.2 1.0 ⎞<br />

−1<br />

A/<br />

B = ⎜<br />

⎟ ≈ A*<br />

B<br />

⎝−<br />

0.4 − 2.0⎠<br />

⎛− 0.3 2.9⎞<br />

−1<br />

A \ B = ⎜ ⎟ ≈ A * B<br />

⎝ 0.1 0.7⎠<br />

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

2 nd Semester, 2005<br />

2 nd Semester, 2005<br />

2


간단한 통계 함수<br />

5. 통계 operator<br />

: min(), max(), sum(), mean(), median(), var(), std()<br />

: bar(), bar3(), hist(), hist3(), boxplot()<br />

: rand(), randn(), unidrnd(), unifrnd()<br />

(문제) A가 행렬인 경우 max(A)는 <br />

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

(문제) mean 과 median의 차이는<br />

(문제) bar 와 hist의 차이는<br />

데이터의 로드와 저장<br />

6. 데이터(파일)의 입출력<br />

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

: save()를 이용한다.<br />

(예) >> save myData.mat data1 data2 data3<br />

: 이 경우에는myData.mat는 binary file이 된다.<br />

>> save myData.txt data4 –ascii<br />

: 이 경우는acsii 파일즉아무뷰어로나볼수있는텍스트파일이된다.<br />

(b) 데이터 파일을 읽어 오는 경우<br />

: load() 를 이용한다.<br />

>> load myData.mat % matlab format file<br />

>> load myData.txt % ascii file<br />

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

한다.<br />

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

2 nd Semester, 2005<br />

2 nd Semester, 2005<br />

예제 문제<br />

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

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

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

(b) 변수중하나를ascii format으로 데이타 파일로 저장하고, notepad로 그내<br />

용을 확인해 보라.<br />

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

(d) 변수 중에서 행렬로 되어 있는 것을 골라 일정 깊이에 있는 것 만을 선택적<br />

으로 추출해 보라.<br />

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

2D & 3D graphics<br />

매트랩이 공학이나 수치해석에서 강력한 툴이 된 이유 중의 하나가 내장되어 있<br />

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

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

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

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

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

한다.<br />

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

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

기바람.<br />

>> help graphics (또는 graph2d, graph3d, specgraph)<br />

2 nd Semester, 2005<br />

2 nd Semester, 2005<br />

Cross plots<br />

Graphics Handler<br />

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

가장 기본적인 것을 말한다.<br />

이 범주에 드는 가장 대표적인 함수들이 “plot()”, “scatter()”, “plotyy()” ,<br />

“ezplot()” , “semilogx()”, “semilogy()”, “loglog()”등이 있다.<br />

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

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

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

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

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

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

2 nd Semester, 2005<br />

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

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

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

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

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

>> h1 = figure;<br />

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

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

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

>> get(h2)<br />

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

>> set(h2, ‘linewidth’, 3)<br />

와같이쓰면된다.<br />

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

2 nd Semester, 2005<br />

3


Graphics Handler<br />

Graphics Handler<br />

>> get(h1) % Figure<br />

Alphamap = [ (1 by 64) double array]<br />

BackingStore = on<br />

CloseRequestFcn = closereq<br />

Color = [0.8 0.8 0.8]<br />

Colormap = [ (64 by 3) double array]<br />

CurrentAxes = [304.002]<br />

CurrentCharacter = h<br />

CurrentObject = []<br />

CurrentPoint = [0 0]<br />

DockControls = on<br />

DoubleBuffer = on<br />

…<br />

Position = [420 528 560 420]<br />

Renderer = painters<br />

…<br />

>> get(h2) % Plot<br />

Color: [0 0 1]<br />

EraseMode: 'normal'<br />

LineStyle: '-'<br />

LineWidth: 0.5000<br />

Marker: 'none'<br />

MarkerSize: 6<br />

MarkerEdgeColor: 'auto'<br />

MarkerFaceColor: 'none'<br />

XData: [1 2 3 4 5 6 7 8 9 10]<br />

YData: [1x10 double]<br />

ZData: [1x0 double]<br />

BeingDeleted: 'off'<br />

ButtonDownFcn: []<br />

Children: [0x1 double]<br />

……<br />

2 nd Semester, 2005<br />

2 nd Semester, 2005<br />

Graphics Handler<br />

Subplot<br />

>> get(gca) % Axes<br />

…<br />

Color = [1 1 1]<br />

…<br />

FontName = Helvetica<br />

FontSize = [10]<br />

FontUnits = points<br />

FontWeight = normal<br />

…<br />

LineStyleOrder = -<br />

LineWidth = [0.5]<br />

…<br />

Position = [0.13 0.11 0.775<br />

0.815]<br />

TickLength = [0.01 0.025]<br />

TickDir = in<br />

…<br />

XTick = [ (1 by 10) double array]<br />

2 nd Semester, 2005<br />

XTickLabel =<br />

1<br />

2<br />

…<br />

10<br />

XTickLabelMode = auto<br />

…<br />

YTick = [ (1 by 9) double array]<br />

YTickLabel =<br />

0.2<br />

…<br />

1<br />

…<br />

Children = [305.002]<br />

…<br />

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

# of data<br />

Value<br />

12<br />

10<br />

2 nd Semester, 2005<br />

8<br />

6<br />

4<br />

2<br />

0<br />

-2.5 -2 -1.5 -1 -0.5 0 0.5 1 1.5 2<br />

Value<br />

2<br />

1<br />

0<br />

-1<br />

-2<br />

-3<br />

0 0.2 0.4 0.6 0.8 1<br />

Time<br />

이러한 경우 subplot()을 사용한다.<br />

>> subplot(2, 1, 1)<br />

>> hist(value, 20)<br />

>> subplot(2, 1, 2)<br />

>> plot(time, value, ‘.’)<br />

Surface Plot – surf()<br />

Surface Plot – surf()<br />

면구조를 그리는 경우의 가장 쉬운 예는 Topographic map이다. 이경우에2차원<br />

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

로 쓰이는 함수이다.<br />

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

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

>> z = peaks(100);<br />

>> surf(z)<br />

>> shading interp<br />

>> camlight<br />

>> lighting phong<br />

>> print –djpeg99 a.jpg<br />

앞의 예제와 같은 면구조를 나타내는 또 하나의 범용적인 방법은 등고선으로 나<br />

타내는 것이다. 다음의 예제는 contour()을 이용해 등고선도를 그린것이다.<br />

등고선도의 높이를 나타내기 위해서 colorbar()를 이용하여 그림의 우측에<br />

등고선 색의 높이를 표시하고 있다.<br />

>> z = peaks(100);<br />

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

>> colorbar<br />

100<br />

90<br />

80<br />

70<br />

60<br />

50<br />

40<br />

30<br />

6<br />

4<br />

2<br />

0<br />

-2<br />

20<br />

-4<br />

10<br />

10 20 30 40 50 60 70 80 90 100<br />

-6<br />

2 nd Semester, 2005<br />

2 nd Semester, 2005<br />

4


Surface Plot – 비등간격 데이타<br />

비등간격 데이타 - 예제<br />

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

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

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

또는 interp2()이용.<br />

<br />

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

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

이 아니므로 먼저 등간격의 x1,y1을 만든다.<br />

90<br />

>> [x1,y1]=meshgrid(0:2:100, 0:2:100);<br />

80<br />

그 다음엔 주어진 자료들로 부터 (x1,y1)에서<br />

70<br />

의예측값들을구한다.<br />

60<br />

>> z1 = griddata(x, y, z, x1, y1);<br />

50<br />

또는<br />

40<br />

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

30<br />

20<br />

Original Data<br />

비등간격, incomplete data<br />

griddata 이용 후의 결과<br />

10<br />

10 20 30 40 50 60 70 80 90<br />

2 nd Semester, 2005<br />

2 nd Semester, 2005<br />

그림화일과 같은 2차원 구조<br />

3차원 데이타 Graphics<br />

앞에서우리는지각과같은면의높이가주어<br />

진상태에서relief map이나 등고선도를<br />

그리는 방법에 대해서 알아보았다.<br />

우리가 잘아는 그림파일들도 (bmp, jpg, tiff)<br />

이와 똑같이 2차원 구조를 가진다. 그림<br />

파일을 표시하는 함수는 imagesc(),<br />

pcolor()와 같은것이있고2차원 data에<br />

는 언제나 사용가능 하다. 그림파일을<br />

특수하게 다루는 함수에는 imread(),<br />

imshow()등이 있다.<br />

20<br />

40<br />

60<br />

80<br />

100<br />

20 40 60 80 100<br />

앞에까지 다룬 예제는 실제는 2차원 data이다. 여기서는 실제 3차원 자료, 즉 3<br />

차원 grid의 각 점마다 데이타가 주어진 경우를 다루어 보자.<br />

Data는 3차원에서 구슬을 채워넣은 공극구조 (random pack of spheres)를 염수<br />

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

>> load curr.mat<br />

>> whos curr<br />

Name Size<br />

curr 101x101x101<br />

100<br />

>> subplot(2,1,1)<br />

>> imagesc(z)<br />

>> subplot(2,1,2)<br />

>> pcolor(z)<br />

80<br />

60<br />

40<br />

20<br />

>> subplot(211)<br />

>> slice(curr, [1],[1],[101])<br />

>> shading flat<br />

>> axis tight<br />

>> axis image<br />

>> colorbar<br />

20 40 60 80 100<br />

2 nd Semester, 2005<br />

2 nd Semester, 2005<br />

3차원 데이타 Graphics<br />

NaN<br />

앞의 그림은 가장자리 면의 전류를 표시하기 때문에 실제 어떻게 전류가 흘렀는<br />

지 보기가 힘들다. 다음과 같이 하면 보다 직관적으로 이해하기 쉬운 그림<br />

을그릴수있다.<br />

>> slice(curr, [ ],[ ],[14 40 70])<br />

>> shading flat<br />

>> axis tight<br />

>> colorbar<br />

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

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

체 하는데 이와 비슷한 역할을 한다.<br />

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

nanmean(), nanmedian(), nanstd(), nanvar(), nanmin(), nanmax(), nansum(),<br />

isnan()<br />

2 nd Semester, 2005<br />

2 nd Semester, 2005<br />

5


Linkaxes()<br />

Graphic Handler revisited<br />

>> ax(1) = subplot(1,2,1);<br />

>> plot(vshale,depth), axis ij<br />

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

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

>> linkaxes(ax)<br />

>> h=plot(vshale);<br />

>> axis ij<br />

>> set(gca,’fontname’,’tahoma’,fontsize’,11)<br />

>> xlabel('Vsh')<br />

>> ylabel('Depth (ft)')<br />

x 10 4<br />

0.2<br />

0.4<br />

0.6<br />

0.8<br />

0.2<br />

0.4<br />

x 10 4 0 0.5 1<br />

0.2<br />

0.4<br />

x 10 4 0 0.2 0.4 0.6 0.8<br />

3000<br />

3000<br />

Depth (ft)<br />

1<br />

0.6<br />

0.6<br />

4000<br />

4000<br />

1.2<br />

0.8<br />

0.8<br />

5000<br />

5000<br />

1.4<br />

1<br />

1<br />

6000<br />

6000<br />

1.2<br />

1.2<br />

7000<br />

7000<br />

1.6<br />

1.4<br />

1.4<br />

1.6<br />

1.6<br />

8000<br />

8000<br />

1.8<br />

0 0.2 0.4 0.6 0.8 1<br />

Vsh<br />

1.8<br />

0 0.5 1<br />

1.8<br />

0 0.2 0.4 0.6 0.8<br />

2 nd Semester, 2005<br />

2 nd Semester, 2005<br />

Graphic Handler revisited<br />

Graphic Handler revisited<br />

>> h=plot(vshale,depth);<br />

>> axis ij<br />

x 10 4<br />

0.2<br />

>> h=plot(vshale);<br />

>> axis ij<br />

x 10 4<br />

0.2<br />

>> set(gca,’fontname’,’tahoma’,’fontsize’,11)<br />

0.4<br />

>> set(gca,’fontname’,’tahoma’,fontsize’,11)<br />

0.4<br />

>> xlabel('Vsh')<br />

0.6<br />

>> xlabel('Vsh')<br />

0.6<br />

>> ylabel('Depth (ft)')<br />

>> set(h, ‘color’, ‘r’)<br />

Depth (ft)<br />

0.8<br />

1<br />

>> ylabel('Depth (ft)')<br />

>> set(h, ‘color’, ‘r’)<br />

>> set(gca, ‘color’, ‘b’)<br />

Depth (ft)<br />

0.8<br />

1<br />

1.2<br />

1.2<br />

1.4<br />

1.4<br />

1.6<br />

1.6<br />

1.8<br />

0 0.2 0.4 0.6 0.8 1<br />

1.8<br />

0 0.2 0.4 0.6 0.8 1<br />

Vsh<br />

Vsh<br />

2 nd Semester, 2005<br />

2 nd Semester, 2005<br />

Graphic Handler revisited<br />

많이 쓰이는 handler’s properties<br />

>> h=plot(vshale);<br />

>> axis ij<br />

>> set(gca,’fontname’,’tahoma’,fontsize’,11)<br />

>> xlabel('Vsh')<br />

>> ylabel('Depth (ft)')<br />

>> set(h, ‘color’, ‘r’)<br />

>> set(gca, ‘color’, ‘b’)<br />

>> set(gcf, ‘color’, ‘g’)<br />

Depth (ft)<br />

x 10 4<br />

0.2<br />

0.4<br />

0.6<br />

0.8<br />

1<br />

1.2<br />

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

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

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

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

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

1.4<br />

1.6<br />

나머지는 각자 알아볼 것.<br />

1.8<br />

0 0.2 0.4 0.6 0.8 1<br />

Vsh<br />

2 nd Semester, 2005<br />

2 nd Semester, 2005<br />

6


그림창의 메뉴들<br />

Plot 과 같이 많이 쓰이는 함수들<br />

File – new, open, close, save, save as, generate m-file, preferences, export setup,<br />

page setup, print setup, print preview, print<br />

Edit – copy figure, copy options, figure properties, axes properties<br />

View – figure toolbars, camera toolbars, plot edit toolbars, property editor<br />

Insert – x,y,z label, title, legend, line, arrow, etc.<br />

Tools – edit plot, zoom, rotate, axes properties, basic fitting, data statistics<br />

title()<br />

xlabel()<br />

ylabel()<br />

text()<br />

gtext()<br />

grid on/off<br />

hold on/off<br />

axis()<br />

subplot()<br />

axes()<br />

ginput()<br />

view()<br />

2 nd Semester, 2005<br />

2 nd Semester, 2005<br />

<strong>Matlab</strong> Function: m-file<br />

<strong>Matlab</strong> Function: m-file<br />

Fortran 의 subroutine 이나 function, 또는 C/C++의 method function과 같이동<br />

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

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

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

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

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

>> edit mean<br />

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

function y = mean(x,dim)<br />

%MEAN Average or mean value.<br />

% For vectors, MEAN(X) is the mean value of the elements in X. For<br />

% matrices, MEAN(X) is a row vector containing the mean value of<br />

% each column. For N-D arrays, MEAN(X) is the mean value of the<br />

% elements along the first non-singleton dimension of X.<br />

%<br />

% MEAN(X,DIM) takes the mean along the dimension DIM of X.<br />

%<br />

% Example: If X = [0 1 2<br />

% 3 4 5]<br />

%<br />

% then mean(X,1) is [1.5 2.5 3.5] and mean(X,2) is [1<br />

% 4]<br />

%<br />

% Class support for input X:<br />

% float: double, single<br />

2 nd Semester, 2005<br />

2 nd Semester, 2005<br />

<strong>Matlab</strong> Function: m-file<br />

함수의 선언<br />

%<br />

% See also MEDIAN, STD, MIN, MAX, COV.<br />

% Copyright 1984-2004 The MathWorks, Inc.<br />

% $Revision: 5.17.4.1 $ $Date: 2004/03/09 16:16:26 $<br />

if nargin==1,<br />

% Determine which dimension SUM will use<br />

dim = min(find(size(x)~=1));<br />

if isempty(dim), dim = 1; end<br />

y = sum(x)/size(x,dim);<br />

else<br />

y = sum(x,dim)/size(x,dim);<br />

end<br />

함수의 맨 처음은 항상 다음과 같은 형태를 가진다.<br />

function y = mean(x,dim)<br />

이 파일이 함수임을 나타냄<br />

두개의 input 변수를 가짐<br />

함수의 이름이 mean<br />

계산결과가 y라는 변수로 출력<br />

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

고하자. 그러면 그 함수는 다음과 같은 형태를 지닐수 있다.<br />

function myPlot(x,y)<br />

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

줄 필요가 없어서 y가 생략되어있다.<br />

2 nd Semester, 2005<br />

2 nd Semester, 2005<br />

7


함수의 설명문<br />

함수의 설명문<br />

함수의 선언부 바로 다음에 빈 줄이 없이 % 기호로 시작되는 설명문이 등장한다.<br />

function y = mean(x,dim)<br />

%MEAN Average or mean value.<br />

% For vectors, MEAN(X) is the mean value of the elements in X. For<br />

% matrices, MEAN(X) is a row vector containing the mean value of<br />

% each column. For N-D arrays, MEAN(X) is the mean value of the<br />

% elements along the first non-singleton dimension of X.<br />

%<br />

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

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

의 help 에 해당되는 부분이다.<br />

%로 시작되는것은설명문이라고해석된다. (Fortran에서 C로 시작하는 comment<br />

문과 같은 역할). 하지만 함수선언 부분과 이 설명문 사이에 빈 줄이 없다는<br />

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

는않는다.<br />

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

때, 아랫부분은 표시되지 않는다.<br />

%<br />

% Class support for input X:<br />

% float: double, single<br />

%<br />

% See also MEDIAN, STD, MIN, MAX, COV.<br />

% Copyright 1984-2004 The MathWorks, Inc.<br />

% $Revision: 5.17.4.1 $ $Date: 2004/03/09 16:16:26 $<br />

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

2 nd Semester, 2005<br />

2 nd Semester, 2005<br />

함수의 내용 (implementation)<br />

함수의 내용 (implementation)<br />

dim = min(find(size(x)~=1));<br />

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

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

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

find( size(x) ~= 1) : find는 size(x)가 1이 아닌경우의그첨자(index)를 return 한다.<br />

현재 A의 경우는 모두가 크기가 1이 아니므로 [1 2 3]을 리턴한다.<br />

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

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

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

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

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

2방향이 된다.<br />

dim = min(find(size(x)~=1));<br />

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

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

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

>> mean(A,3)<br />

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

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

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

>> mean(A)<br />

의 결과값의 사이즈는 ( x x )<br />

2 nd Semester, 2005<br />

2 nd Semester, 2005<br />

함수의 내용 (implementation)<br />

함수의 내용 (implementation)<br />

function y = mean(x,dim)<br />

if nargin==1,<br />

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

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

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

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

이 경우를 잠시 생각해 보자.<br />

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

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

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

을 우리는 배웠다. (1 방향, 2 방향). 그래서 방향을 정하지 않은 경우는 1 방<br />

향이라고 가정한다.<br />

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

if isempty(dim), dim = 1; end<br />

위에서 우리는 평균을 구하는 방향을 정했는 데, 또 방향을 구하는 하나의 명령문<br />

이 들어가 있다. 이 경우는 어떤 경우인가<br />

만약 user가 input변수로 사이즈가 0인 변수를input으로 넣었다고 하자. 사이즈가<br />

0인 변수가 과연 어떻게 존재하는 가<br />

>> A=ones(0,0)<br />

과같은경우가해당되는데이와같은문을쓰는user는 없다. 하지만 우리가 어떤<br />

계산을 수행하였는데 결과가 없을 때 매트랩은 공집합, 즉 사이즈가 0인 변수<br />

를리턴한다. 만약 우리가 그 결과를 평균함수에 대입하는 경우가 가장 빈번<br />

히 발생하는 경우이다. 따라서 이 경우도 처리를 해주어야 하는데 여기서는<br />

isempty()라는 함수를 쓴다. 만약 크기가 0인 변수의 경우 이 함수값은 1이<br />

된다. 그 경우위의dim = min(find(size(x)~=1)); 는 0의 방향을 리턴하므로 우<br />

리는 이 경우를 1의 방향으로 명시할 필요가 있다.<br />

2 nd Semester, 2005<br />

2 nd Semester, 2005<br />

8


함수의 내용 (implementation)<br />

If-else-end 문과 Loop 문<br />

if nargin == 1<br />

y = sum(x)/size(x,dim);<br />

else<br />

y = sum(x,dim)/size(x,dim);<br />

end<br />

그 다음으로 넘어가 보자. 이제 우리는 user가 방향을 지정하지 않은 경우 방향을<br />

모두 구했다. 따라서 평균값은 y = sum(x)/size(x,dim); 와같이모든값을더해<br />

서그갯수로나누어주면된다.<br />

User가 방향을 정한 경우는 그 방향으로 합을 구하고, 그 방향으로의 갯수 (사이즈)<br />

로나누어주면이함수의기능은끝이난다.<br />

이제 만약 크기가 0인 값을input변수로 넣었을 경우를 다시 생각해 보면, 그 방향<br />

은앞에서1로 잡았다. 그런데 이 값들의 합도 0이고 갯수도 0이므로 결국<br />

0/0의 꼴이되어서error가 생긴다. 이러한 error도 이 함수가 처리해야 하는<br />

가는 함수를 만든 사람의 생각에 따라 다르다. 현재 매트랩함수 mean()은 이<br />

경우에 divided-by-zero error를 낸다.<br />

실제로 하나의 함수을 만들어 보기 전에 알고리듬의 기본이 되는 두가지 구조 – 조<br />

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

조건문 (if-else-end)<br />

계산식이 조건등에 따라 틀려질 경우 if문을 쓰게 되는데, 다른 언어에서와 같이 그<br />

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

야한다.<br />

if(a>0)<br />

if(a>=1)<br />

a=a*100;<br />

else<br />

a=a*50;<br />

end<br />

elseif(a==0)<br />

a=0;<br />

else<br />

a=-50*a;<br />

end<br />

2 nd Semester, 2005<br />

2 nd Semester, 2005<br />

If-else-end 문과 Loop 문<br />

함수 만들기 – 예제 (벡터의 내적)<br />

다음은 반복계산을 하는 경우를 예로 들어보자. Fortran에서는 do-loop를 많이쓰는<br />

데 매트랩에서는 for-loop가 표준이다.<br />

다음의 예는 100개의 x값에 대해서 그 값은 로그값의 사인값을 구하는 loop의 예제<br />

이다.<br />

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

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

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

y=zeros(1,100);<br />

for i=1:100<br />

y(i) = sin( log (x(i)) );<br />

end<br />

많은 경우에 매트랩의 벡터나 행렬 operator를 이용해서loop를 없앨수가있는데<br />

이 방법이 계산시간이 적게 걸리므로 장려되는 방법이다.<br />

y=sin( log (x) );<br />

는앞의루프를이용한식과같은결과를제공한다.<br />

그리고 while()문이 라는 것도 있는데 while(조건)-end 사이에있는것을조건이참<br />

인 동안 반복실행한다.<br />

2 nd Semester, 2005<br />

(1) Input 변수는 몇 개이어야 하는가<br />

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

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

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

2 nd Semester, 2005<br />

벡터의 내적을 구하는 함수<br />

벡터의 내적을 구하는 함수<br />

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

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

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

(1) Input 변수는 몇 개이어야 하는가<br />

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

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

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

function c=dot(a, b)<br />

% Inner product of two vectors<br />

% ……<br />

if( length(find(size(a)~=1)) >1 |<br />

length(find(size(b)~=1)) >1 )<br />

disp(“Input parameters should be vectors”);<br />

end<br />

if( length(a) ~= length(b) )<br />

disp(“Two vectors should have the same size”);<br />

end<br />

c=0.0<br />

for i=1:length(a)<br />

c=c+a(i)*b(i); 또는 c= a(:)’ * b(:);<br />

end<br />

2 nd Semester, 2005<br />

2 nd Semester, 2005<br />

9


y<br />

Review on Functions/Parameters covered<br />

m-file revisited<br />

edit(), nargin, find(), isempty(), if-elseif-else-end, for-end, while<br />

length(), disp(), sqrt(), input()<br />

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

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

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

법이다.<br />

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

능하다 (script file).<br />

<br />

Sine Function<br />

1.5<br />

% sine 함수를 plot 하는 script<br />

t=linspace(0,8*pi,2000);<br />

plot(t, sin(t), ‘r’);<br />

axis([0 8*pi -1.5 1.5]); grid on<br />

xlabel(‘Time’), ylabel(‘sin(Time)’)<br />

title(‘Sine Function’)<br />

sin(Time)<br />

1<br />

0.5<br />

0<br />

-0.5<br />

-1<br />

-1.5<br />

0 5 10 15 20 25<br />

Time<br />

2 nd Semester, 2005<br />

2 nd Semester, 2005<br />

m-file revisited<br />

수치 알고리듬의 implementation<br />

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

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

면 다음과 같이 함수를 만들면 된다.<br />

function sineplot(sTime, eTime)<br />

t=linspace(sTime, eTime, 2000);<br />

plot(t, sin(t), 'r');<br />

axis([sTime, eTime, -0.5, 1.5]);<br />

grid on<br />

xlabel('Time'), ylabel('sin(Time)'),<br />

title('Sine Function')<br />

-1.5<br />

>> sineplot(0, 4*pi) 0 2 4 6 8 10 12<br />

sin(Time)<br />

1.5<br />

1<br />

0.5<br />

0<br />

-0.5<br />

-1<br />

Sine Function<br />

Time<br />

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

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

프로그램을 작성하라.<br />

ezplot이나 symbolic math를 이용해서analytic하게 그림을 그리는 경우도 있겠지만,<br />

많은 경우 수치해석에서는 많은 점들을 이어 그려서 연속된 함수의 그래프를<br />

완성한다.<br />

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

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

의방정식은y = ax + b 이다.<br />

x = linspace(x1, x2, 2000);<br />

y = a*x + b;<br />

2 nd Semester, 2005<br />

2 nd Semester, 2005<br />

수치 알고리듬의 implementation<br />

수치 알고리듬의 implementation<br />

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

plot(x, y)<br />

이를 정리해서 함수로 만들면, 리턴하는 변수는 필요없고 입력변수는 4개 (기울기,<br />

절편, x 시작값, x 끝값) 가된다.<br />

function drawLine(a, b, x1, x2)<br />

x=linspace(x1, x2, 2000);<br />

y=a*x1 + b;<br />

plot(x, y); grid on<br />

xlabel(‘x’), ylabel(‘y’)<br />

20<br />

15<br />

10<br />

5<br />

0<br />

-5<br />

-10<br />

-15<br />

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

작성하라.<br />

2<br />

2 2<br />

일단우리는원의방정식을알고있다. ( x − x1)<br />

+ ( y − y1)<br />

= r<br />

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

효과적이다.<br />

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

x = r cos( θ )<br />

y = r sin( θ )<br />

θ<br />

r<br />

( r cosθ,<br />

r sinθ<br />

)<br />

-20<br />

-25<br />

>> drawLine(2, -1, -10, 10) -10 -8 -6 -4 -2 0 2 4 6 8 10<br />

x<br />

2 nd Semester, 2005<br />

2 nd Semester, 2005<br />

10


y<br />

y<br />

수치 알고리듬의 implementation<br />

수치 알고리듬의 implementation<br />

중심을 (x1, y1)으로 이동하는<br />

앞의 내용을 함수로 정리하면,<br />

것은 단지 평행이동이기 때문에,<br />

x = r cos( θ ) + x1<br />

y = r sin( θ ) + y1<br />

그러면, 우리는 원의 x와 y의 좌표를<br />

각으로 표현할 수 있다.<br />

( r cosθ<br />

+ x1,<br />

r sinθ<br />

+ y1)<br />

r<br />

θ<br />

(x1, y1)<br />

function plotCircle(r, x1, y1)<br />

theta = linspace(0, 2*pi, 2000);<br />

x = r * cos( theta) + x1;<br />

y = r * sin( theta) + y1;<br />

plot(x, y), grid on<br />

10<br />

9<br />

8<br />

7<br />

6<br />

5<br />

theta = linspace(0, 2*pi, 2000);<br />

x = r * cos(theta) + x1;<br />

y = r * sin(theta) + y1;<br />

axis image<br />

xlabel('x'), ylabel('y')<br />

4<br />

3<br />

2<br />

1<br />

0<br />

>> plotCircle(6, 2, 5)<br />

-2 0 2 4 6 8<br />

x<br />

2 nd Semester, 2005<br />

2 nd Semester, 2005<br />

수치 알고리듬의 implementation<br />

복잡한 수식을 가진 함수 - Viscoelasticity<br />

앞의함수의경우원의경계가Axis의 경계와 맞물려 보기가 좋지 않으므로 axis의<br />

최대, 최소값을 조정할 필요가 있다.<br />

function plotCircle(r, x1, y1)<br />

theta = linspace(0, 2*pi, 2000);<br />

x = r * cos( theta) + x1;<br />

y = r * sin( theta) + y1;<br />

plot(x, y), grid on<br />

axis image<br />

xlabel('x'), ylabel('y')<br />

axis( [min(x)-1, max(x)+1,…<br />

min(y)-1, max(y)+1] )<br />

10<br />

8<br />

6<br />

4<br />

2<br />

0<br />

-4 -2 0 2 4 6 8<br />

x<br />

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

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

도는<br />

M μ<br />

Vp<br />

= , Vs<br />

= ,<br />

ρ ρ<br />

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

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

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

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

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

E 1<br />

E 2<br />

>> plotCircle(6, 2, 5)<br />

2 nd Semester, 2005<br />

2 nd Semester, 2005<br />

η<br />

복잡한 수식을 가진 함수 - Viscoelasticity<br />

복잡한 수식을 가진 함수 - Viscoelasticity<br />

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

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

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

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

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

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

할것이다.<br />

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

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

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

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

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

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

다. 이를 파의 감쇄 (attenuation)이라고 한다.<br />

앞의 결과를 자세히 이야기 하기는 너무 복잡하므로, 다음 요약된 그림으로 보면 x<br />

축은 주파수이고 두개의 그래프는 탄성계수와 감쇄계수(1/Q)이다. 탄성파의<br />

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

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

곳이다.<br />

2 nd Semester, 2005<br />

2 nd Semester, 2005<br />

11


복잡한 수식을 가진 함수 - Viscoelasticity<br />

복잡한 수식을 가진 함수 - Viscoelasticity<br />

앞의 내용을 적당한 근사를 이용해서 수식으로 풀어보면 다음과 같은 식을 갖는다.<br />

참고로 감쇄가 일어나는 경우 탄성계수는 복소수가 되는 데 이것의 실수성분<br />

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

앞의 수식을 M 0 가 1, M ∞ 가 4, 밀도가 1이라고 하면 다음과 같은 그림이 나온다. 이<br />

제 우리는 이것들을 입력변수로 해서 이 그림을 그리는 함수를 만들어 보자.<br />

⎛<br />

M(ω) = E ( E + iωη)<br />

M ∞<br />

M 0<br />

+ i ω ⎞<br />

⎜ M 0<br />

M ∞ ⎟<br />

2 1<br />

E 1<br />

+ E 2<br />

+ iωη = ⎝ ω r<br />

⎠<br />

M ∞<br />

+ i ω M 0<br />

M ∞<br />

ω r<br />

V =<br />

Re[ M ( ω)]<br />

ρ<br />

1 Re[ M ( ω)]<br />

=<br />

Q Im[ M ( ω)]<br />

1 1 ω dV<br />

= −<br />

2<br />

V V V dω<br />

g<br />

2 nd Semester, 2005<br />

2 nd Semester, 2005<br />

ω/ω r<br />

복잡한 수식을 가진 함수 - Viscoelasticity<br />

복잡한 수식을 가진 함수 - Viscoelasticity<br />

그림에서 보듯이 우리의 독립변수 (x) 는 ω/ω r 이다. 따라서 우리는 이 값을<br />

omega라고 하자. 그림에서 보듯이 이 주파수는 로그스케일로 그려져 있다.<br />

그래서 linspace대신에 logspace를 이용해 보자.<br />

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

다음은 이 각각의 값에 대해서 일단 M을 계산해야 한다. 입력변수 M 0 , M ∞ 를 M0,<br />

Minf라고 하자.<br />

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

이렇게 하고 나면 omega와 그길이가같은M벡터가 가 생겼다. 이 벡터는 복소수<br />

임에 주의하라. 우리가 구해야 하는 속도, 감쇄계수는 M의 함수로<br />

V = sqrt( real(M) ./ density );<br />

Qinv = imag(M) ./ real(M);<br />

이제 탄성파의 그룹속도 만이 남았다. 그런데 이 수식에는 아직 우리가 배우지 않<br />

은미분값이들어있다.<br />

2 nd Semester, 2005<br />

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

V g<br />

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

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

f 1 f 2 f 3 f 4 f 5 f 6<br />

x 1 x 2 x 3 x 4 x 5 x 6<br />

diff(f) = [f2-f1, f3-f2, f4-f3, f5-f4, f6-f3]<br />

df ( f2<br />

− f1)<br />

≈<br />

dx<br />

at=<br />

x<br />

( x2<br />

− x1)<br />

1<br />

주의할점은벡터의길이가하나준다는<br />

사실이다. 이는 미분이 기울기이고<br />

기울기는 두 점이 필요하므로 당연<br />

한결과이다.<br />

2 nd Semester, 2005<br />

2<br />

V<br />

=<br />

dV<br />

V −ω d ω<br />

복잡한 수식을 가진 함수 - Viscoelasticity<br />

복잡한 수식을 가진 함수 - Viscoelasticity<br />

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

를구할수있다. 한가지 주의 할 점은 여기서 Δx 는 omega의 차이인데, 우<br />

리가 logspace를 썼기 때문에 이것이 일정하지 않다는 사실이다. 따라서 x<br />

축 값의 차이를 각각 계산해야 한다.<br />

dV = diff(V);<br />

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

dOmega = diff(omega);<br />

dOmega = [dOmega dOmega(end)];<br />

dVdw = dV ./ dOmega;<br />

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

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

해야 한다.<br />

2 nd Semester, 2005<br />

정리하여 함수를 만들어 보자.<br />

function plotViscoElas(M0, Minf, density)<br />

omega = logspace(-2, 2, 10001);<br />

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

V = sqrt( real(M) ./ density );<br />

Qinv = imag(M) ./ real(M);<br />

dV = diff(V);<br />

dV = [dV dV(end)];<br />

dOmega = diff(omega);<br />

dOmega = [dOmega dOmega(end)];<br />

dVdw = dV ./ dOmega;<br />

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

semilogx(omega, V, 'b'), hold on<br />

semilogx(omega, Qinv, 'r'), semilogx(omega, Vg, 'k:')<br />

legend('V','1/Q','Vg')<br />

xlabel('{\omega} / {\omega}_r')<br />

ylabel('Value')<br />

2 nd Semester, 2005<br />

12


복잡한 수식을 가진 함수 - Viscoelasticity<br />

>> plotViscoElas(1,4,1)<br />

Value<br />

2.5<br />

V<br />

1/Q<br />

2<br />

Vg<br />

1.5<br />

1<br />

0.5<br />

0<br />

10 -2 10 -1 10 0 10 1 10 2<br />

ω / ω r<br />

2 nd Semester, 2005<br />

구간에 따라 함수가 다른 경우<br />

π<br />

다음과 같은 함수가 있다고 하자. y = sin( x) : 0 ≤ x <<br />

2<br />

π π<br />

y = 2 − cos( x − ) : ≤ x < π<br />

2 2<br />

5π<br />

y = 2 + tan( x −π<br />

) : π ≤ x <<br />

4<br />

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

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

y = zeros( size(x) );<br />

for i=1:length(x)<br />

if(x(i)


평균, 분산, 그리고 상관계수 구하기<br />

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

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

m = mean( data2( :, 3:5) );<br />

sd = std( data2( :, 3:5) );<br />

ccoef = corrcoef( data( :, 3:5) );<br />

물론 위와 같이 하지 않고 각각의 농도값들을 다른 변수로 지정해서 각각 평균, 표<br />

준편차, 상관계수들을 구해도 된다. 하지만 이렇게 구하는 것이 함수가 보다<br />

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

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

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

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

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

2 nd Semester, 2005<br />

격자화 자료 구하기<br />

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

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

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

의 갯수를 먼저 구해 보자.<br />

원래의 좌표들의 갯수는<br />

ndata = length( data2(:,1) );<br />

그리고 x와 y의 좌표들의최대최소값은<br />

minx = min( data2(:,1) ); maxx = max( data2(:,1) );<br />

miny = min( data2(:,2) ); maxy = max( data2(:,2) );<br />

그래서 데이타가 들어가는 box의 크기는<br />

lx = (maxx - minx); ly = (maxy - miny);<br />

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

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

다.<br />

2 nd Semester, 2005<br />

격자화 자료 구하기<br />

격자화 자료 구하기<br />

앞의 결과를 종합하면<br />

nx = sqrt( ndata * lx / ly);<br />

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

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

ny = round ( nx * ly / lx );<br />

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

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

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

이타를 구하려고 한다.<br />

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

격자데이타는 다음과 같이 주어진다.<br />

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

[x1, y1] = meshgrid(x, y);<br />

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

as = griddata( data2(:,1), data2(:,2), data2(:,3), x1, y1);<br />

cd = griddata( data2(:,1), data2(:,2), data2(:,4), x1, y1);<br />

pb = griddata( data2(:,1), data2(:,2), data2(:,5), x1, y1);<br />

minx<br />

nx<br />

maxx<br />

dx = lx / (nx+1);<br />

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

<br />

2 nd Semester, 2005<br />

surf() 를 이용한 plot<br />

surf() 를 이용한 plot<br />

이제 모든 자료가 구해졌고, 이를 이용해 단지 plot을 하면된다.<br />

figure;<br />

subplot(3,1,1); surf(x1, y1, as);<br />

xlabel('X'); ylabel('Y'); title('Arsenic');<br />

shading interp; camlight; lighting phong; axis tight<br />

subplot(3,1,2); surf(x1, y1, cd);<br />

xlabel('X'); ylabel('Y'); title('Cadnium');<br />

shading interp; camlight; lighting phong; axis tight<br />

마지막은 또 다른 그래프를 그려서 카드늄의 농도로 surface를 그높이color는 납<br />

의 농도로 표시하는 것이다.<br />

figure;<br />

surf(x1, y1, cd, pb);<br />

xlabel('X'); ylabel('Y'); title('Cadnium');<br />

shading interp; camlight;<br />

lighting phong; axis tight<br />

colorbar<br />

subplot(3,1,3); surf(x1, y1, pb);<br />

xlabel('X'); ylabel('Y'); title('Lead');<br />

shading interp; camlight; lighting phong; axis tight<br />

2 nd Semester, 2005<br />

2 nd Semester, 2005<br />

14


결과 m 파일<br />

function [ m, sd, ccoef ] = hw2prob6( filename )<br />

data = load( filename );<br />

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

data2 = data( ind, : );<br />

m = mean( data2( :, 3:5) );<br />

sd = std( data2( :, 3:5) );<br />

ccoef = corrcoef( data( :, 3:5) );<br />

ndata = length( data2(:,1) );<br />

minx = min( data2(:,1) ); maxx = max( data2(:,1) );<br />

miny = min( data2(:,2) ); maxy = max( data2(:,2) );<br />

lx = (maxx - minx); ly = (maxy - miny);<br />

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

ny = round ( nx * ly / lx );<br />

dx = lx / (nx+1);<br />

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

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

[x1, y1] = meshgrid(x, y);<br />

결과 m 파일 - 계속<br />

figure;<br />

subplot(3,1,1); surf(x1, y1, as);<br />

xlabel('X'); ylabel('Y'); title('Arsenic');<br />

shading interp; camlight; lighting phong; axis tight<br />

subplot(3,1,2); surf(x1, y1, cd);<br />

xlabel('X'); ylabel('Y'); title('Cadnium');<br />

shading interp; camlight; lighting phong; axis tight<br />

subplot(3,1,3); surf(x1, y1, pb);<br />

xlabel('X'); ylabel('Y'); title('Lead');<br />

shading interp; camlight; lighting phong; axis tight<br />

figure;<br />

surf(x1, y1, cd, pb);<br />

xlabel('X'); ylabel('Y'); title('Cadnium');<br />

shading interp; camlight; lighting phong; axis tight<br />

colorbar<br />

as = griddata( data2(:,1), data2(:,2), data2(:,3), x1, y1);<br />

cd = griddata( data2(:,1), data2(:,2), data2(:,4), x1, y1);<br />

pb = griddata( data2(:,1), data2(:,2), data2(:,5), x1, y1);<br />

2 nd Semester, 2005<br />

2 nd Semester, 2005<br />

Fourier Transform (푸리에 변환)<br />

Fourier Transform (푸리에 변환)<br />

푸리에 변환이란 무엇인가<br />

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

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

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

고 있다는 사실을 유추해 볼 수 있다.<br />

2 nd Semester, 2005<br />

Height<br />

Height<br />

20<br />

15<br />

10<br />

5<br />

0 50 100 150 200 250 300 350 400<br />

Day<br />

20<br />

15<br />

10<br />

5<br />

0 1 2 3 4 5 6 7 8<br />

Day<br />

앞의 시계열 데이타를 푸리에<br />

변환한 결과가 오른 편<br />

에 나타나 있다.<br />

여기로부터무엇을알수있<br />

는가<br />

1. 주기가 0인 데이타: 백그라<br />

운드 데이타<br />

2. 주파수가 0.0027 (1/day)인<br />

데이타: 이는 주기가 약<br />

365일인 데이타<br />

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

이타: 주기가 약 0.53,<br />

즉 12시간 50분인 데이<br />

타 - 실제 조석<br />

2 nd Semester, 2005<br />

Real amplitude<br />

Real amplitude<br />

Real amplitude<br />

FT of<br />

10 x 105 5<br />

0<br />

-5<br />

-15 -10 -5<br />

time series<br />

0<br />

1/day<br />

5 10 15<br />

x 10 5<br />

8<br />

6<br />

4<br />

2<br />

0<br />

5<br />

0<br />

-5<br />

x 10 4<br />

0 1 2 3 4 5 6 7<br />

1/day<br />

x 10 -3<br />

1.88 1.9 1.92 1.94 1.96 1.98<br />

1/day<br />

기본 지식<br />

기본 지식<br />

시간(주기) 주파수<br />

sec, day hertz, 1/day…<br />

공간(파장) 파수<br />

m, micron 1/m, 1/micron<br />

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

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

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

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

재하고 나머지는 전부 0이다.<br />

1<br />

0.5<br />

0<br />

-0.5<br />

-100<br />

cos(2πt)<br />

-1<br />

0 2 4 6 8 10<br />

500<br />

400<br />

300<br />

200<br />

100<br />

0<br />

FT cos(2πt)<br />

-4 -3 -2 -1 0 1 2 3 4<br />

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

는 함수로 구성된다면 어떻게 될까<br />

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

1인 코사인과주기가2 인코사인의합으<br />

로주어진다.<br />

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

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

지를 가지고 나머지에서는 0이다.<br />

다시 말하면 푸리에 변환을 하면 그 시계열이<br />

가지는에너지의주된주파수성분을알<br />

수있다.<br />

* 주기 : 반복이 일어나는 시간차이.<br />

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

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

2<br />

1.5<br />

1<br />

0.5<br />

0<br />

-0.5<br />

-1<br />

-1.5<br />

0 2 4 6 8 10<br />

500<br />

400<br />

300<br />

200<br />

100<br />

0<br />

cos(2πt) + cos(πt)<br />

FT[ cos(2πt) + cos(πt)]<br />

-1 -0.5 0 0.5 1 1.5<br />

2 nd Semester, 2005<br />

2 nd Semester, 2005<br />

15


푸리에 급수<br />

복소수와 극 좌표계<br />

이러한 푸리에 변환과 푸리에 급수는 어떻게 다른가<br />

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

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

와 cos()함수를 이용한다.<br />

다음의 결과가 알려져 있다.<br />

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

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

것이다.<br />

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

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

구하는데매우유용하게쓰일수있다.<br />

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

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

2 nd Semester, 2005<br />

y(<br />

t)<br />

=<br />

∑ ∞<br />

n=<br />

0<br />

{ a cos( nt)<br />

+ b cos( nt)<br />

}<br />

n<br />

n<br />

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

한다.<br />

복소수 (Complex number) : z=x+iy<br />

x: 실수성분(real part = Re[z])<br />

y: 허수성분(imaginary part = Im[z])<br />

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

2 nd Semester, 2005<br />

z = z (cosθ<br />

, sinθ<br />

)<br />

i<br />

z = z e<br />

θ<br />

2 2<br />

z = x + y<br />

−1⎛<br />

y ⎞<br />

θ = phase = tan ⎜ ⎟<br />

⎝ x ⎠<br />

Im<br />

|z|<br />

θ<br />

( z cosθ,<br />

z sinθ<br />

)<br />

Re<br />

복소수와 극 좌표계<br />

푸리에 변환의 정의<br />

복소 켤레(complex conjugate)<br />

2 nd Semester, 2005<br />

−iθ<br />

2<br />

2 2<br />

* = x − iy = z e → z = zz*<br />

= x + y<br />

z<br />

이를 이용하면 각각의 성분은<br />

z + z * z − z *<br />

x = , y =<br />

2 2i<br />

Euler formula<br />

iθ<br />

e = cosθ<br />

+ i sinθ<br />

e<br />

−iθ<br />

= cos( −θ<br />

) + i sin( −θ<br />

) = cosθ<br />

− i sinθ<br />

iθ<br />

e + e<br />

cosθ<br />

=<br />

2<br />

iθ<br />

−<br />

e − e<br />

sinθ<br />

=<br />

2<br />

−iθ<br />

iθ<br />

*note<br />

i<br />

e<br />

cos 2πft<br />

=<br />

positive<br />

frequency<br />

i<br />

+ e<br />

2<br />

2π<br />

( f ) t 2π<br />

( − f ) t<br />

negative<br />

frequency<br />

Fourier transform of g(t)<br />

t, f : 실수인 독립변수<br />

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

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

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

2 nd Semester, 2005<br />

G(<br />

f ) = FT{<br />

g(<br />

t)}<br />

=<br />

G(<br />

f ) =<br />

∞<br />

∫<br />

−∞<br />

∞<br />

∫<br />

−∞<br />

g(<br />

t)<br />

e<br />

−i2πft<br />

∞<br />

∫<br />

−∞<br />

dt<br />

g(<br />

t)<br />

e<br />

−i2πft<br />

= g(<br />

t)cos(2πft)<br />

dt − i g(<br />

t)sin(2πft)<br />

dt<br />

∞<br />

∫<br />

−∞<br />

dt<br />

역푸리에 변환의 정의<br />

푸리에 변환의 역푸리에 변환<br />

Inverse Fourier transform of G(f)<br />

t, f : 실수인 독립변수<br />

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

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

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

2 nd Semester, 2005<br />

g(<br />

t)<br />

= IFT{<br />

G(<br />

f )} =<br />

g(<br />

f ) =<br />

∞<br />

∫<br />

−∞<br />

i<br />

G(<br />

f ) e<br />

∞<br />

∫<br />

−∞<br />

2πft<br />

dt<br />

∞<br />

∫<br />

−∞<br />

i<br />

G(<br />

f ) e<br />

∞<br />

∫<br />

−∞<br />

2πft<br />

= G(<br />

f )cos(2πft)<br />

dt + i G(<br />

f )sin(2πft)<br />

dt<br />

df<br />

G(f) 가 g(t)의 푸리에 변환이면<br />

⎧ g(<br />

t)<br />

if t is continuous<br />

IFT{<br />

G(<br />

f )} = IFT{ FT{<br />

g(<br />

t)}<br />

} = ⎨<br />

+ −<br />

⎩1/<br />

2{ g(<br />

t ) + g(<br />

t )} if t is discontinuous<br />

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

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

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

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

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

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

2 nd Semester, 2005<br />

16


매트랩에서 푸리에 변환<br />

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

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

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

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

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

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

매트랩에서 푸리에 변환<br />

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

t=[0, 0.02, 0.04,…,0.2] f=[0, 5, 10, 15,…,50]<br />

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

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

dt<br />

1<br />

(N-1)dt<br />

(N-1)dt<br />

1<br />

dt<br />

t<br />

f<br />

결과적으로 다음의 결론을 얻는다.<br />

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

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

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

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

2 nd Semester, 2005<br />

2 nd Semester, 2005<br />

나이퀴스트 주파수 (Nyquist f)<br />

다음의 사인 함수을 제대로 기술하려면 한 주기당 몇개의 데이타가 필요할까<br />

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

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

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

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

다.<br />

1<br />

0.5<br />

0<br />

-0.5<br />

sin(x)<br />

나이퀴스트 주파수 (Nyquist f)<br />

1<br />

f Nyq<br />

=<br />

2dt<br />

1 2 n<br />

t = [0, dt,<br />

2dt,....,<br />

n dt]<br />

→ f = [0, , ,...,<br />

ndt ndt ndt<br />

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

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

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

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

으로 물리적으로 의미는 없다.<br />

n n<br />

n<br />

− − + 1<br />

− −1<br />

2 2 −1<br />

1 2<br />

t = [0, dt,<br />

2dt,....,<br />

n dt]<br />

→ f = [ , ,..., ,0, , ,..., 2 ]<br />

ndt 2ndt<br />

ndt ndt ndt ndt<br />

]<br />

-1<br />

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

-6 -4 -2 0 2 4 6<br />

x<br />

2 nd Semester, 2005<br />

2 nd Semester, 2005<br />

푸리에 변환 매트랩 예제<br />

짝함수(Even) 와 홀함수(Odd)<br />

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

t=linspace(0, 12*pi, 1000);<br />

g=cos(t);<br />

dt=t(2)-t(1);<br />

df=1/dt/(1000-1);<br />

f=[-500:499]*df;<br />

G=fft(g);<br />

G=fftshift(G);<br />

subplot(2,1,1)<br />

plot(t, g);<br />

subplot(2,1,2)<br />

plot(f, G);<br />

2 nd Semester, 2005<br />

1<br />

0.5<br />

0<br />

-0.5<br />

-100<br />

-1<br />

0 5 10 15 20 25 30 35 40<br />

500<br />

400<br />

300<br />

200<br />

100<br />

0<br />

-0.6 -0.4 -0.2 0 0.2 0.4 0.6 0.8 1<br />

어떤 함수 g(t)가 y축을 중심으로 대칭이면 그 함수는 짝함수(even function)이다.<br />

다시 말하면 g(-t)= g(t) 이다.<br />

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

다시 말하면 g(-t)= -g(t) 이다.<br />

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

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

2 nd Semester, 2005<br />

1<br />

0.8<br />

0.6<br />

0.4<br />

0.2<br />

0<br />

-0.2<br />

-0.4<br />

-0.6<br />

-0.8<br />

-1<br />

-1 -0.5 0 0.5 1<br />

1<br />

0.9<br />

0.8<br />

0.7<br />

0.6<br />

0.5<br />

0.4<br />

0.3<br />

0.2<br />

0.1<br />

0<br />

-1 -0.5 0 0.5 1<br />

17


짝함수와 홀함수의 성질<br />

∞<br />

∫<br />

a<br />

∫<br />

2 nd Semester, 2005<br />

O(<br />

t)<br />

df = 0;<br />

O(<br />

t)<br />

df = 0;<br />

E ( t)<br />

E ( t)<br />

= even<br />

O ( t)<br />

O ( t)<br />

= even<br />

a<br />

E(<br />

t)<br />

df = 2 E(<br />

t)<br />

df<br />

−∞<br />

−∞<br />

0<br />

E(<br />

t)<br />

df = 2 E(<br />

t)<br />

df<br />

−a<br />

−a<br />

0<br />

1<br />

1<br />

2<br />

2<br />

∞<br />

∫<br />

∫<br />

∞<br />

∫<br />

a<br />

∫<br />

E(<br />

t)<br />

O(<br />

t)<br />

= odd<br />

Theorem<br />

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

E(<br />

t)<br />

= 1/ 2{ g(<br />

t)<br />

+ g(<br />

−t)<br />

} ← E(<br />

−t)<br />

= E(<br />

t)<br />

O(<br />

t)<br />

= 1/ 2{ g(<br />

t)<br />

− g(<br />

−t)}<br />

← O(<br />

−t)<br />

= O(<br />

t)<br />

g(<br />

t)<br />

= E(<br />

t)<br />

+ O(<br />

t)<br />

짝함수와 홀함수의 이용<br />

다시 푸리에 변환의 정의로 돌아가보자. G(<br />

f ) = FT{<br />

g(<br />

t)}<br />

=<br />

g(<br />

t)<br />

= E(<br />

t)<br />

→ G(<br />

f ) =<br />

g(<br />

t)<br />

= O(<br />

t)<br />

→ G(<br />

f ) =<br />

2 nd Semester, 2005<br />

G(<br />

− f ) =<br />

E(<br />

t) cos( −2πft)<br />

dt = G(<br />

f ) : 실수 짝함수<br />

G(<br />

− f ) = −i<br />

O(<br />

t)sin(<br />

−2πft)<br />

dt = −G(<br />

f ) : 허수 홀함수<br />

g(<br />

t)<br />

= iE(<br />

t)<br />

→ G(<br />

f ) = i E(<br />

t) cos(2πft)<br />

dt +<br />

G(<br />

− f ) = i E(<br />

t)cos(<br />

−2πft)<br />

dt = G(<br />

f ) : 허수 짝함수<br />

g(<br />

t)<br />

= iO(<br />

t)<br />

→ G(<br />

f ) = i O(<br />

t) cos(2πft)<br />

dt +<br />

∞<br />

∫<br />

−∞<br />

∞<br />

G(<br />

− f ) =<br />

E(<br />

t)cos(2πft)<br />

dt − i E(<br />

t)sin(2πft)<br />

dt =<br />

∫<br />

O(<br />

t) cos(2πft)<br />

dt − i O(<br />

t)sin(2πft)<br />

dt = −i<br />

O(<br />

t)sin(2πft)<br />

dt<br />

−∞<br />

∞<br />

∫<br />

∞<br />

∫<br />

∞<br />

∫<br />

−∞<br />

−∞<br />

−∞<br />

∞<br />

∫<br />

∞<br />

∫<br />

−∞<br />

∫<br />

∫<br />

∫<br />

∫<br />

E(<br />

t)sin(2πft)<br />

dt = i E(<br />

t) cos(2πft)<br />

dt<br />

∫<br />

O(<br />

t)sin(2πft)<br />

dt =<br />

O(<br />

t)sin(<br />

−2πft)<br />

dt = −G(<br />

f ) : 실수 홀함수<br />

−∞<br />

∞<br />

−∞<br />

∞<br />

−∞<br />

∞<br />

−∞<br />

∞<br />

−∞<br />

∞<br />

−∞<br />

∞<br />

∫<br />

−∞<br />

E(<br />

t) cos(2πft)<br />

dt<br />

∞<br />

∫<br />

−∞<br />

∞<br />

∫<br />

∫<br />

O(<br />

t)sin(2πft)<br />

dt<br />

−∞<br />

∞<br />

−∞<br />

∞<br />

∫<br />

−∞<br />

g(<br />

t)<br />

e<br />

−i2πft<br />

dt<br />

<strong>Matlab</strong>을 이용한 선형 대수 계산<br />

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

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

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

벡터와 행렬의 Norm<br />

The p-norm of a vector x<br />

⎛<br />

x = ⎜∑<br />

⎝<br />

p<br />

x<br />

p i<br />

i<br />

1/ p<br />

⎞<br />

⎟<br />

⎠<br />

is computed by norm(x,p). This is defined by any value of p > 1, but the most<br />

common values of p are 1, 2, and . The default value is p = 2, which<br />

corresponds to Euclidean length.<br />

The p-norm of a matrix A,<br />

⎛ Ax ⎞<br />

p<br />

A = max⎜<br />

⎟<br />

p x ⎜ x ⎟<br />

⎝ p ⎠<br />

1/<br />

p<br />

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

p = 2.<br />

Ax=b 의 풀이<br />

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

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

(1) m > n : 주어진식이해보다많다(overdetermined). 이 경우에 모든 식을 만<br />

족시키는 해가 없는 경우가 이므로, 실제 구해진 해는 차이값 (에러)들의 합<br />

을 최소화 하는 해를 구한다.<br />

(2) m = m : 식과 해의 갯수가 일치하는 경우로 이 경우에는 대부분 답을 구할<br />

수있다. 다만 주어진 식들중에서 같은 것이 있는 경우 답이 정할 수 없다.<br />

(3) m < n : 주어진 식이 해보다 적을 경우로 (underdetermined), 하나의 해를 구<br />

할수없고관계식이주어진다.<br />

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

Ax=b 의 풀이<br />

만약 행렬 A가 정사각행렬(square matrix)인 경우에는정확한Ax=b의 풀이는A의<br />

역행렬을 구하여, 양변에 곱하면 된다.<br />

x = inv(A) * b;<br />

하지만 행렬 A가 역행렬을 가지지 않는 경우, 다시 말해서 A의 행렬식이0인 경우,<br />

다시 말해서 A의 행렬의 열들이 모두 서로 독립이 아닌 경우는 역행렬을 가<br />

지지 않고 따라서 해는 존재하지 않는다.<br />

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

⎛1<br />

A = ⎜<br />

⎝2<br />

2⎞<br />

⎟,<br />

4⎠<br />

⎛1<br />

B = ⎜<br />

⎝2<br />

2 ⎞<br />

⎟<br />

4.0000000001⎠<br />

위의 B 의 경우는 수학적으로 역행렬을 가지지만, 실제 컴퓨터에서는 역행렬을 계<br />

산할 수도 있고, 못할 수도 있다. 이렇게 행렬이 얼마나 singluar에 가까운 가<br />

를알아보는데는condition number 를 쓴다. >> cond(B)<br />

18


Ax=b 의 풀이<br />

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

⎛1<br />

Ax = b,<br />

BA = ⎜<br />

⎝0<br />

⎛1<br />

0⎞⎛<br />

x1<br />

⎞ ⎛3⎞<br />

⎜ ⎟⎜<br />

⎟ = ⎜ ⎟<br />

⎝0<br />

1⎠⎝<br />

x2<br />

⎠ ⎝2⎠<br />

0⎞<br />

⎟,<br />

1⎠<br />

⎛3⎞<br />

Bb = ⎜ ⎟<br />

⎝2⎠<br />

당연히 행렬 B는 A의 역행렬이다. 그런데 이렇게 역행렬을 곱하고 나면 미지수 x앞<br />

에 있는 행렬이 단위 행렬이 되고 실제 그 해들은 식의 오른 쪽에 있는 Bb가<br />

바로 답이 된다.<br />

따라서, 선형방정식의 여러가지 풀이 방법은 행렬A에 어떤값을곱해서그결과가<br />

근사적으로 단위행렬이 되게 하는 것이 그 기본 목적이다.<br />

Eigenvalue and Eigenvector<br />

사각행렬을 다룰 때, 우리는 흔히 고유값과 고유벡터란 용어를 흔히 쓴다.<br />

이것이 무엇인지 알아보자.<br />

고유값은 어떤 행렬 A가 Ax = λx 를 만족시킬 때 그 때의 스칼라값 λ를 고유값그<br />

리고 벡터 x를 고유벡터라고한다.<br />

이렇게 하기 위해서 우리는 A를 고유값 변환이라는 것을 이용해 행렬을 분해하게<br />

된다. 그 결과만 제시하면,<br />

AV = VΛ,<br />

A = VΛV<br />

−1<br />

여기서 중간에 주어진 행렬은 대각행렬이 된다.<br />

그리고 여기서 우리는 한가지의 사실을 알아야 하는데, 벡터의 좌표변환을 기억해<br />

보면, 다음과 같이 된다.<br />

x ′ = Tx<br />

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

A′ = TAT<br />

−1<br />

Eigenvalue and Eigenvector<br />

Eigenvalue and Eigenvector<br />

따라서 앞의 결과로 부터, 우리는 A라는 행렬은 대각행렬 Λ을 3차원 좌표변환을 한<br />

값이라는 사실을 알 수가 있다.<br />

다음 예제를 살펴보자. 여기서 우리는 (σ xx =4 σ yy =8 σ yx =3.46)이라는 것에서 시<br />

작해서 주응력을 구해보자.<br />

그러면 이 대각행렬의 성분들은 무엇이 되는가 그것은 바로 아까 말했던 고유값들<br />

이다. 그리고 좌표변환에 이용된 행렬 V는 그 행렬의 고유벡터들의 모임이다.<br />

다시 이를 정리하면 무엇이 되는가 어떠한 행렬을 고유분해를 하면 (회전변환) 우<br />

리는 대각행렬을 얻게 된다. 이 내용은 우리에게 매우 익숙하다. 응력의 경우<br />

를예를들어보자. 우리는 응력이 텐서, 다시 말해서 행렬이라는 사실을 알<br />

고있다. 이것을 회전변환을 해서 대각성분만 남는 다는 말은 무엇인가. 응력<br />

장의 좌표를 회전시켜서 주응력(대각성분)만 남긴다는말이다. 다시 말해서<br />

우리가 원하는 eigenvalue는 주응력 성분이 되고, eigenvector는 그주응력방<br />

향이 된다.<br />

30°<br />

2 MPa<br />

10 MPa<br />

2 MPa<br />

y<br />

x<br />

-60°<br />

τ<br />

(σ, τ)<br />

120°<br />

2 6 10<br />

σ<br />

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

10 MPa<br />

σ = 6 - 4×cos(60°) = 4 MPa<br />

τ = 4×sin(60°) = 3.46 MPa<br />

Eigenvalue and Eigenvector<br />

Symbolic Math<br />

이번에는 고유치와 고유 벡터를 구해서, (σ xx =4 σ yy =8 σ yx =3.46)의 결과로부터<br />

주응력을 계산해 보자.<br />

t ⎛ 8 3.46⎞<br />

σ = ⎜ ⎟<br />

⎝3.46<br />

4 ⎠<br />

t<br />

⎛8<br />

− λ 3.46 ⎞<br />

σx<br />

− λx<br />

= 0 ⇒ ⎜<br />

⎟x<br />

= 0<br />

⎝ 3.46 4 − λ ⎠<br />

2<br />

(8 − λ)(4<br />

− λ)<br />

− 3.46 = 0<br />

∴λ<br />

= 10 or 2<br />

이 계산은 매트랩에서 eig() 란 함수로 수행할 수 있다.<br />

>> [v d]=eig([8 3.46; 3.46 4])<br />

v = 0.50 -0.87<br />

-0.87 -0.50<br />

d = 2.00 0<br />

0 10.00<br />

또 다른 매트랩에서 유용한 tool중의 하나는 symbolic math의 기능이다.<br />

이는 실제 숫자를 이용하지 않고 문자로 계산하는 방법이다.<br />

예를 들어<br />

>> solve( 'a*x^2 + b*x + c = 0', 'x')<br />

1/2/a*(-b+(b^2-4*a*c)^(1/2))<br />

1/2/a*(-b-(b^2-4*a*c)^(1/2))<br />

이는 여러분이 잘 아는 이차방정식의 근의 공식이다. 그러면 3차방정식의 근은<br />

>> solve( 'a*x^3 + b*x^2 + c*x + d = 0', 'x')<br />

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-<br />

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-<br />

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<br />

-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-<br />

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-<br />

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)-<br />

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-<br />

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-<br />

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))<br />

-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-<br />

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-<br />

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-<br />

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-<br />

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-<br />

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))<br />

19


Symbolic Math<br />

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

치환할수있다.<br />

>> sol = solve( 'a*x^3 + b*x^2 + c*x + d = 0', 'x');<br />

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

>> a=1; b=0; c=0; d=-1;<br />

>> eval(sol)<br />

1.0000<br />

-0.5000 + 0.8660i<br />

-0.5000 - 0.8660i<br />

이경우sol 은 식을가진symbolic object가 되고, 여기에 값을 대입해 해를 구하고<br />

싶을 땐, 각각의 변수에 값을 대입하고 eval()을 이용해서그함수를구하면<br />

된다.<br />

Symbolic Math<br />

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

그중몇가지만살펴보면,<br />

함수의 미분과 적분<br />

>> diff( ‘sin(x)’, ‘x’)<br />

cos(x)<br />

>> int('sin(a*x)','x')<br />

-1/a*cos(a*x)<br />

>> int('sin(x)','x',0, pi)<br />

2<br />

>> int('sin(a*x)','x',0, pi)<br />

-(cos(pi*a)-1)/a<br />

20

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!