http://engi-agora.tistory.com/8

Matlab / 매트랩] 매트랩 강의 5번째

5. 3차원 그래프 그리기 (3D graph)

이미 매트랩으로 2차원 그래프는 어느정도 그릴 수 있으리라 생각하고, 이제 3차원으로 슬슬 눈을 돌릴때가 되지 않았나 싶네요.

후후, 그렇습니다. 오늘은 드디어 3차원 그래프를 다뤄볼 그 시간입니다 !!!!

2차원 그래프는 다음과 같은 X,Y의 데이터 세트를 한 그래프에 나타내는 것이었습니다.

2차원 그래프를 그리기 위해서는 X, Y의 세트가 필요했지만

3차원 그래프를 그리기 위해서는 당연히 데이터 세트가 3개가 필요할 것입니다.

X , Y, Z 이렇게 바로 3개로 말이죠!!

이때 X Y Z가 나타날 수 있는 방법은 크게 2가지 경우가 있을 수 있겠는데요.

첫째는 X Y Z 가 하나의 데이터가 independent 한 경우이고,
두번째는 X Y Z에서 두개의 데이터가 independent 한 경우입니다.

일부러 말을 좀 어렵게 써봤습니다....는 아니고ㅠ 뭐 그래요.
쉽게 풀어서 쓰자면 첫번째 경우는 Y Z가 모두 X로 표현되는 경우이고
두번째 경우는 Z가 X,Y로 표현되는 경우
지만, X Y는 서로 관계가 없는 경우를 뜻합니다.

첫번째 경우와 두번째 경우의 각각 예를 들어 볼게요.

1) 첫번째 경우의 예
Y=X*3
Z=X^2+X+2
(X는 실수집합)

2) 두번째 경우의 예
Z=X^2 + Y^2
(X, Y 는 실수집합)

흐흐 오늘은 뭔가 설명이 쉽게 안되는것 같군요.....흑ㅠ

그래프로 차이를 보여 드리도록 할게요.

1) 첫번째 경우같은 그래프는 다음과 같은 형태로 표현됩니다: (아, 위의 예와는 다른 식입니다.)

2) 두번째 경우의 그래프는 다음과 같은 형태로 표현됩니다: ( 마찬가지로 위의 예와는 다른 식입니다. 유의)

그래프로 보시니 조금 감이 오실듯 하나요??

즉, 첫번째 경우는 X가 바뀌는데 따라서 Y도 바뀌고 Z도 바뀌니깐
X가 하나로 결정되면 Y,Z도 하나로 결정된다는 의미입니다.
예를 들어 X가 1이라면 Y는 2, Z는 3, 이런형태로 반드시 하나만 나오게 됩니다.

반면에 두번째 경우는 X가 하나로 결정되도 Y는 어떤 값이든 가질 수 있게 됩니다.
예를 들어 X가 1이라도 Y는 1일수도 2일수도 3일 수도 ...... 모든 값을 가질 수 있다는 말이죠.
그래서 두번째 경우는 X의 값이 하나로 결정되더라도 Y의 값이 여러개가 존재하므로 면과 같은 형태의 그래프가 나오고
첫번째 경우는 선과 같은 형태의 그래프가 나오게 되는 것입니다.

요렇게 두개로 구분한 이유는!!
사실 이 두개의 경우에 따라 그래프를 그리는 명령어가 다르기 때문이에요.

첫번째 경우는 plot3 이란 함수를 쓰고 두번째 경우는 mesh라는 함수
를 씁니다.

차례대로 한번 예시를 들어보도록 하겠습니다.

1. 입력 변수가 1개인 경우 (명령어: plot3)

자, 이 경우 X,Y,Z는 무조건 하나의 변수로 정의가 되어야 합니다.

예를들어 모두 X로 표시가 된다든지,

X=[1:0.01:10];
Y=2.*X;
Z=3.*(X.^2)+6;

혹은 모두 Y로 표시가 된다든지,

Y=[1:0.01:10];
X=3.*Y
Z=X.^2+Y.^2;

(Z에서 X로 쓰였지만 결국 X는 Y로 표현되기 때문에 Z는 Y로만 표현된 것이라 볼 수 있습니다.)

혹은 임의의 t로 표시가 된다든지 해야 하는 것입니다.

t=[1:0.01:10];
X=3.*t;
Y=t.^3+2.*t
Z=3./t + 21.*t;

이런식으로 데이터 구조가 작성되었다면 그래프 그리는건 식은죽 먹기 입니다.
요렇게 나타내 주시면 끝나요.

plot3( X데이터, Y데이터 , Z데이터);

예를 하나 들어볼까요? 매트랩 help를 뒤적이시면 나오는 예입니다.
지금 이 경우는 t로 X,Y,Z데이터를 다 표현했습니다.

ex)
>> t = 0:pi/50:10*pi;
>> plot3(sin(t),cos(t),t);

이 경우에도 2차원 그래프 그릴때와 마찬가지로 옵션적용이 다 가능합니다. 물론 figure, hold on, subplot도 마찬가지로 다 먹히죠.

그래프를 빨간색 동그라미로 나타내고
제목을 달고,
x,y,z 라벨 표시
grid on

요 순서로 옵션 적용을 한번 해볼께요.

>> plot3(sin(t),cos(t),t,'ro')
>> title('3d graph');
>> xlabel('x axis')
>> ylabel('y axis')
>> zlabel('z axis')
>> grid on

네, 다 잘먹혀 들어가는 것을 보실수 있습니다. 참 쉽죠잉?

2. 입력 변수가 2개인 경우 (명령어: mesh)

이 경우는 데이터 구조가 이런식으로 주어지게 됩니다.

위에서 봤을 때의 데이터를(z11 z12 z13 z14 순서대로) X축의 데이터로
옆에서 봤을 때의 데이터를(z11 z21 z31 z41 순서대로) Y축의 데이터로 받아줍니다.

그리고 이때 X의 j번째,Y의 i번째에 해당하는 데이터 Z(i,j)가 그래프의 출력이 되는 셈입니다.
흠 말이 조금 어렵나요??

만일
Z=
[1 2 3 4 5
6 7 8 9 10
11 12 13 14 15]

로 주어졌다면, x축의 데이터는 5개, y축의 데이터는 3개가 되는 셈입니다.

이때, x범위를 만일 1 2 3 4 5// y 범위를 1 2 3 으로 지정한다면

x가 1, y가 2일 때는 z값은 6이라는 데이터를 내뱉어 준다 요런말이죠.

이런 경우일 때는 mesh 라는 명령어를 쓰는데요.

기본적으로 mesh는 요렇게 쓰입니다.

mesh(X 데이터, Y 데이터, Z 데이터)

문제는 요 Z 데이터라는 놈이 m by n 형태의 행렬로 입력이 되어야 한다는 거죠!!!!!!!

근데 여기서 잘 생각해 보셔야 할게 있습니다,

Z=X^2+Y^2 라는 식이 주어졌다고 하고, X범위가 1~3까지, Y범위가 1~5까지라고 합시다.

그럼 단순하게

x=[1:1:3];
y=[1:1:5];
z=x.^2+y.^2;

으로 한다면 z데이터가 행렬로 나올수가 있을까요????

절대로 아니겠죠. 일단 x, y의 범위 자체가 다르기 때문에 계산도 안될 뿐더러,

계산이 된다 하더라도 z는 벡터 값을 가지게 되어 절대로 처음에 원했던 결과가 나오지 않게 됩니다.

그럼 이를 해결하기 위해서는 어떻게 해야 할까요????

바로 x데이터와 y데이터 자체를 z데이터가 계산가능하도록 행렬로 변환해주어야 합니다.

즉 x가 1일 때, y값은 1~5 까지의 값을 모두 가질 수 있는 데이터 한 줄,
x가 2일때 y 값이 1~5까지 값을 모두 가질 수 있는 데이터 한 줄 이런식으로 바꿔져야 한다는 말이죠.

무슨말인지 잘 와닿지 않을 것이라 생각하고...... 일단 필요한 결과 행렬을 보여 드리겠습니다.

X=[1 2 3
1 2 3
1 2 3
1 2 3
1 2 3]

Y=[1 1 1
2 2 2
3 3 3
4 4 4
5 5 5]

이렇게 X, Y 가 행렬로 표시된다면 Z 는,

X가 1일때 Y가 1~5까지
X가 2일때 Y가 1~5까지
X가 3일때 Y가 1~5까지의

값을 모두 다 받아 줄 수 있게 되는 셈입니다.

근데 물론 이거 사람이 직접하면 매트랩 아무도 안쓰겠죠?

명령어 있습니다. 역시나!!!!!

[X데이터 ,Y데이터 ] = meshgrid(x범위, y범위)

요렇게 입력해주시면 되는 거에요.

그럼 위에서 나왔던 식을 한번 mesh를 이용해서 그려볼게요.

예제) Z=X^2+Y^2, X범위가 1~3까지, Y범위가 1~5까지일때의 그래프를 그려라.

>> x=[1:0.1:3];
>> y=[1:0.1:5];
>> [X Y]=meshgrid(x,y);
>> Z=X.^2+Y.^2;
>> mesh(X,Y,Z)

마찬가지로 title, xlabel, ylabel, axis([Xmin Xmax Ymin Ymax Zmin Zmax]) 등의 명령어는 물론 쓸 수 있습니다.

아, 그리고 명령어에 넣을 때, Z데이터는 행렬로 나와 줘야만 하지만, x,y는 행렬로 넣어줄 필요는 없습니다.

위의 예에서 mesh(x,y,Z)라고 해도 그래프는 똑같이 그려집니다!! 혹여나 햇갈리실까 하여....

오늘은 뭔가 설명히 딱딱한 느낌이네요ㅠ..가을타는가..........흑ㅠ
다음엔 재미있는 도형 그리기로 넘어가봅시다. 슬슬 난이도가 올라가는 느낌이 물씬 풍기네요ㅠ


반응형

+ Recent posts