Matlab Tutorial
Matlab Tutorial
Matlab Tutorial
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