반응형
Recent Posts
Recent Comments
Link
관리 메뉴

공머씨의 블로그

내가 공부한 옥타브2 16.3D그래프 본문

내가 공부한 옥타브(매틀랩)/내가 공부한 옥타브 시리즈2 (공업수학1)

내가 공부한 옥타브2 16.3D그래프

공머씨 2020. 4. 3. 18:26
반응형

12. 3차원 그래프 그리기 

plot3 함수로 3차원 곡선 그래프 그리는 것부터 공부하겠습니다.

인자로 3개의 벡터를 필요로 하는데

plot 하고자 하는 점들의 x, y, z좌표의 값들을 각각 저장해 놓아야 합니다.

plot3(x, y, z) 명령은 벡터 x, y, z의 좌표값들이 나타내는 점들을 3차원 공간에 plot 하고 그 점들 사이를 매끈한 곡선으로 연결해서 선 그래프를 그립니다.

명령 창에서 다음 명령어를 한 줄씩 실행하면서, plot3 함수의 사용법을 익혀봅시다.

 

 

 

Figure window화면은 다음과 같습니다.

위와 같은 x, y, z축의 좌표가 생성되었고 좌표 (0,1,1)에 'o'가  찍힌 것을 볼 수가 있습니다.

네 번째 인자는 점의 모양을 나타냅니다.

 

 

 

 

 

 

13. 두 번째 명령을 입력해보겠습니다.

아래와 같은 명령을 입력해봅니다.

x, y, z인자에 숫자가 2개씩 들어가 있는데 이는 두 개의 plot를 선으로 연결하는 것입니다.

 

-        : -모양의 실선

네 번째 인자 '*-' 의미는 :   각 점 은 *모양으로 찍고 점 과점 사이를 실선으로 연결하라는 뜻입니다.

[] 안에 23 이렇게 붙이면 안 되고 2 3 띄어주어야 두 개의 점인 것을 매트랩이 인식합니다.

 

 

아래와 같은 Figure window화면이 뜹니다.

다운로드하여서 편집하고 다시 보내니까 화질이 이상해졌는데

빨간 네모칸 안에 있는 것은 (0, 0, 0) 좌표와 (1, 0, 1) 좌표입니다. 두 점은 *모양의 점이 찍혀있음을 확인해보시기 바랍니다.

P.S 네 번째 인자에서 *을 빼거나 *- 을 둘 다 빼면 그냥 실선으로 그래프가 그려집니다.

 

 

 

 

14. 세 번째 명령을 보겠습니다.

위와 같은 코드를 실행시켜보시기 바랍니다.

 

아래와 같은 Figure window화면이 나타납니다.

 

점들의 좌표를 보면 아래 그림과 같습니다.

x좌표는 x좌표끼리

y좌표는 y좌표끼리

z좌표는 z좌표끼리

구성하여 plot의 인자를 만든다는 것을 알 수가 있습니다.

 

 

 

Figure window에서 검은색 동그라미 안에 있는 x좌표를 0.6으로 표시했어야 하는데 모르고 1로 표시했네요...

 

 

 

 

15. 삼각형 모양의 그래프를 3차 원상에 그리기 (예제 10a)

 

프로그램을 짜지 않고 command window에 명령한 개만을 입력하여 위와 같은 그래프를 만들 수가 있습니다.

 

주의할 것은 위에서 나타낸 3개의 점을 그대로 입력하면 안 되고 x성분, y성분, z성분끼리 구분해서 입력해주어야 한다는 것입니다.

첫 번째 인자와 두 번째 인자를 연결해주고 

두 번째 인자와 세 번째 인자를 연결한 삼각형의 형태였습니다.

세 번째 인자와 첫 번째 인자를 선으로 연결하면 위와 같은 형태의 삼각형이 나올 것입니다.

 

 

 

 

 

 

여기서 좌표 눈금을 보이게 만들고 싶다면 grid on명령을 사용하면 됩니다.
또 원하는 위치에 text를 표시하고 싶다면 gtext() 명령 안에 text를 입력한 뒤 원하는 그래프 위치에 마우스 커서를 클릭하면 됩니다. 

글자크기도 조절할 수가 있습니다.

 

grid on을 입력하지 않고 Figure Window에 있는 grid버튼을 한번 눌러주어도 됩니다.

그럼 grid on은 왜 있냐? 다른 유용한 용도로 쓰입니다.

 

 

 

16. 한 바퀴 돌아가는 helix그래프_ 예제 10b(1)

 

x값과 y값이 계속 변하지만 반경이 1인 원위에서 변하게 됩니다.

따라서 z값은 신경 쓰지 말고 x, y값만 살펴보게 되면   (z 축 위에서 x, y평면을 내려다보면 된다.)

t가 0에서 2pi까지 변할 때 cos t의 주기가 2pi이기 때문에 x^2+y^2의 식은 원을 한 바퀴 빙 돌아가는 그런 자취를 갖게 됩니다. 그런데  z값이 0으로 그대로 있지 않고 x, y가 한 바퀴 도는 동안 z값도 0에서 증가하게 된다.

원기둥을 따라 돌면서 2pi까지 올라가는 그런 곡선이 됩니다.

스프링 같은 곡선을 helix곡선이라고 합니다.

아래 힌트를 보고 직접 해보시기 바랍니다.

(유한 엔터)

 

 

 

 

 

 

 

 

 

 

전체 코드와 결과 화면입니다.

 

% 예제 10b의 1번 helix그래프 입니다.
t=[0:.1:2*pi] %매개변수 t의 범위
x=cos(t)%x계산
y=sin(t) %y계산
z=t      %z계산
plot3(x,y,z)%3D line plot
xlabel('cos t');
ylabel('sin t');
zlabel('t');
text(0,0,0,'origis');
title('A helix!');
grid on
gtext('example10b(1)','FontSize',20)

 

많은 분들이 실수하시는 것이 2pi라고 입력하면 안 됩니다.

2pi는 수학에서는 저렇게 쓰지만

매트랩, 옥타브에서는 반드시 단위 요소별 연산자를 사용하여

2*pi라고 해야 합니다.

 

 

 

text () 함수는 작은따옴표 안에 있는 문자열을 입력한 좌표에 나타나게 합니다.

이 그래프에서는 (0,0,0)인 지점에 text가 나타난 것을 볼 수 있습니다.

만약 원하는 위치에 text를 보이게 하고 싶다면 gtext함수를 사용하면 됩니다.

Figurewindow에서 마우스를 클릭한 지점에 첫 번째 인자에 설정된 문자열이 나타납니다.

두 번째 인자와 세 번째 인자는 글자의 크기를 바꾸어 주는 문자열입니다.

 

 

 

 

17. 더 스프링 같은 helix그래프 _예제 10b(2)

(2) 번처럼 t의 범위를 0부터 10pi라고 하면 다섯 바퀴를 빙 돌아가는 형태가 됩니다.

(cosine , sine함수 그래프의 주기가 2pi이므로 ,, 10pi까지 5번 진동하겠지요....)

한번 진동이 0에서 2pi까지 움직이는 것을 한 번 진동한다고 하면..

16번의 힌트를 참고하여 직접 해보시기 바랍니다.

 

(유한 엔터)

 

 

 

 

 

 

 

 

 

 

전체 코드와 결과 화면입니다.

 

 

 

t=[0:.1:10*pi] %매개변수 t의 범위
x=cos(t)%x계산
y=sin(t) %y계산
z=t      %z계산
plot3(x,y,z)%3D line plot
xlabel('cos t');
ylabel('sin t');
zlabel('t');
text(0,0,0,'origis');
title('A helix!');
grid on
gtext('example10b(2)','FontSize',14)

 

 

 

 

18. 조금 다른 helix그래프를 그려봅시다. _예제 10c(1)

 

(1)

10b의 (2) 번과 비슷한 그래프입니다.

달라진 내용은 10b (2)의 경우에는 x, y가 삼각함수의 그래프를 가졌는데

이번에는 y, z가 삼각함수의 그래프를 가집니다.

그렇기 때문에 x축을 중심으로 해서  나선 모양으로 돌아가는 helix그래프가 됩니다. 

16번의 힌트를 참고하여 직접 해보시기 바랍니다.

 

(유한 엔터)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

전체 코드와 결과 화면입니다.

%예제 10c1의 그래프 입니다.
t=[0:0.001:1] %매개변수 t의 범위
x=t%x계산
y=2.*cos(8*pi*t) %y계산
z=2.*sin(8*pi*t)%z계산
plot3(x,y,z)%3D line plot
grid on
gtext('example10c(1)','FontSize',20)

 

 

 

 

 

 

 

 

 

 

 

 

19. 올라갈수록 원의 크기가 줄어든 helix그래프_예제 10c(2)

 

(2) x, y가 삼각함수의 그래프를 가지므로 

z축상에 있는 원기둥의 표면을 따라서 돌아가는 그런 곡선인데 , 앞에 지수함수가 있기 때문에  t값이 커질수록 cosine과 sine그래프의 진폭이 작아지므로 위로 올라갈수록 원의 크기가 점점 줄어드는 helix그래프가 됩니다.

16번의 힌트를 참고하여 직접 해보시기 바랍니다.

 

(유한 엔터)

 

 

 

 

 

전체 코드와 결과 화면입니다.

%예제 10c2의 그래프 입니다.
t=[0:0.001:1] %매개변수 t의 범위
x=2*exp(-2*t).*cos(8*pi*t)%x 계산
y=2*exp(-2*t).*sin(8*pi*t) %y계산
z=sqrt(t) %z계산
plot3(x,y,z)%3D line plot
grid on
gtext('example10c(2)','FontSize',20)

 

 

 

 

 

 

전체코드와 결과화면 입니다.

%예제 10번 c에 대한 코드입니다.

%예제 10c2의 그래프 입니다.
t=[0:0.001:1] %매개변수 t의 범위
x=t%x계산
y=2.*cos(8*pi*t) %y계산
z=2.*sin(8*pi*t)%z계산
subplot(121)
plot3(x,y,z) %3D line plot
title('example 10c (1)')
grid on

%예제 10c2의 그래프 입니다.
t=[0:0.01:1] %매개변수 t의 범위
x=2*exp(-2*t).*cos(8*pi*t)%x 계산
y=2*exp(-2*t).*sin(8*pi*t) %y계산
z=sqrt(t) %z계산
subplot(122)
plot3(x,y,z) %3D line plot
title('example 10c (2)')
grid on

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

20. 3차원 그래프를 그리기 위해 mash() surf() 함수 사용하는 방법에 대해서 알아본다. _예제 11 a

 

 

mesh() 함수는 3개의 행렬 x, y, z를 필요로 합니다.

행렬 x, y, z는 plot 하고자 하는 점들의 x좌표, y좌표, z좌표가 들어있어야 한다.

그렇게 되면 mash(x, y, z)의 명령은 행렬 x, y, z값 들이 나타내는 점을 3차원 공간에 plot 합니다.

plot 한 점들을 노드로 하는  mash surface를 (그물망면을) 3차원 공간에 그리게 됩니다.

 

3차원 공간상에 12점의 좌표가 들어있다고 해보자.(파란네모박스 (x,y)점들)

이 12점을 노드로 하는 그물망면을 그리는 프로그램을 작성하라는 문제인데 풀이를 보면

 

노드라는 것은 좌표에 의해서 지정된 점(아래 사진에서 빨간 동그라미)을 이야기합니다. 

 

 

12개의 점을 노드로 하는 그물망면을 그려야 하기 때문에  mesh() 함수를 써야 하는데

mash함수를 쓰기 위해서는 행렬 인자 x, y, z의 plot 할 점들의 좌표값들을 다 집어넣어야 한다.

좌표값들은 주어져있으니까 문제에 있는 점을 그대로 집어넣으면 된다.

 

 

바닥면에서 오른쪽이 x축, 왼쪽이 y축, 높이가 z 축입니다.

x좌표는 1,2,3                        y좌표는 1,2,3,4  이렇게 있다.

(x가 1일 때 y가 1,2,3, 4       x가 2일 때 y가 1,2,3,4)

점 x, y가 정의가 되면 그 정의된 각각의 점에 대해서  z좌표가 정의되어 위의 바둑판  그림과 같은 좌표가 만들어집니다.

그 좌표들은 아래와 같습니다.

위와 같은 좌표들을  프로그램에서는 다 입력해주어야 하는데  예제 11a에서는 손으로 입력해보겠습니다.

 

왜 좌표값이 위와 같이 되는지 설명하기 위해 그려보았습니다.

 

 

첫 번째 줄의 행렬을 모아서 작성하고 

두 번째 세 번째, 네 번째 줄 모두 같은 성분의 같은 줄의 행렬을 모아서 위와 같이 작성하는 것입니다.

 

 

실제로 나중에는 손으로 타이핑해서 입력할 필요도 없고 그렇게 할 수도 없다. >>저절로 좌표를 생성하는 함수가 있다, 데이터의 양이 방대하기 때문에 

그런데  연습 삼아 손으로 타이핑하여 입력해보겠습니다.

 

전체 코드와  결과 화면입니다.

x=[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];
z=[1,1,1;2,2,2;3,3,3;4,4,4];
mesh(x,y,z)

 

eleven이라는 이름의 m파일로 저장한뒤 실행시켜 주었습니다.

 

 

 

 

21. 예제 11-b를 하기 전에 mesh grid함수에 대해서 알아보도록 하겠습니다.

앞의 예제에서는 좌표값을 타이핑해서 넣어주었지만 만약에 plot 할 점들이 100,1000개.. 가 넘는다면 

직접 좌표값을 찍어 넣는 것이 불가능하므로 자동으로 좌표값을 만들어 내는 것이 필요하다.

자동으로 x, y좌표를 만들어내는 함수가 meshgird함수입니다.

meshgrid함수의  형태는  다음과 같습니다.

[X, Y]=meshgrid(x, y) 

벡터 2개가 인자로 필요하고 (X, Y 두 개의 벡터가 인자가 됩니다.)

인자로 사용되는 X벡터에는 x, y평면의 정의역에 x의 범위와 y의 범위가 들어가 있게 됩니다.

그러면 x, y에 의해서 지정된 사각형 범위 내의 점의 좌표들을 자동으로 만들어내서 

행렬 X와 행렬 Y에 저장하게 됩니다.

 

x, y좌표를 나타내는 그림 추가

 

위와 같은 바둑판 모양의 그래프를 만들기 위해

그래프를 이루는 점들의 좌표를 행렬로 나타내었습니다.

 

그러면 z좌표는? >> 계산을 해서 찾아야 한다.

meshgrid 함수에 행렬 X, Y를 인자로 대입하여 x, y좌표를 나타내고

z좌표는 함수의 식을 이용해서  계산해서 구하게 됩니다.

 

 

22. mesh 함수와 surf함수로 3D 곡면 그래프 그리기_예제 11b

 

예제 11a에서 처럼 직접 좌표값을 입력하지 말고 meshgrid를 사용하기!

 

mesh grid 함수를 사용하려면 x, y의 범위를 정해야 하기 때문에  범위부터 알아보도록 합니다.

점들을 잘 보면 x의 범위는 1,2,3 임을 알 수 있고 

y값은 1,2,3,4로 변하는 것을 알 수 있습니다.

 

 

 

 

그리고 각각의 x, y값에 대해서 3차원 좌표에서  z 축 방면으로 z좌표가 정의되는데

z좌표는 x값에 상관없이 y값에 의존한다는 것도 관찰을 통해 알 수 있습니다.

z=y^2이라는 식을 세울 수 있습니다.

관찰을 통하여 범위와 z 식을 확인하고 나면 90% 이상 해결되었습니다.

아래의 힌트를 보고 마무리를 하면 되겠습니다.

(대문자 X Y Z는 행렬을 나타내는 변수입니다. 소문자와 다른 변수입니다.)

[X, Y]=meshgird(x, y) 명령은 사각형 범위 내에 있는 모든 점들의 좌표를 찾아내서 X행렬과 Y행렬에 대입하게 됩니다.

각각의 x, y좌표에 대해서 z좌표는 y의 제곱이 된다.

 

 

 

(유한 엔터)

 

 

 

 

 

 

 

 

전체 코드와 결과 화면입니다.

%ex11b에 대한 코드 입니다.
x=[1 2 3] %meshgrid(x,y)를 쓰기 위해 
y=[1 2 3 4] %meshgrid(x,y)를 쓰기 위해 
[X,Y]=meshgrid(x,y); %x,y범위 사각형 내의 모든 점의 좌표값들을 행렬 X,Y에 저장
Z=Y.^2 %Z값은 Y값 제곱의 함수식을 갖는다.
mesh(X,Y,Z) %결론적으로 mesh graph를 그리기 위한 함수
grid on %좌표를 표기해준다.
title('example 11b') %제목
gtext('example11b','FontSize',20) %클릭한곳에 크기가 20인 텍스트가 그려짐

 

 

 

 

 

20. 마지막으로 예제 11c는 surf그래프를 사용하게 된다._예제 11c

surf()와 mesh() 차이점은  그물망 면 대신 색칠된 그래프를 그리는 명령입니다.

x, y각각의 점들을 잘게 쪼갠 뒤 점들을 많이 만들어서 그래프를 그립니다.

그렇게 3차원 그래프를 그리면 부드러운 곡면 그래프가 나옵니다.

 

 

 

x, y의 간격을 아주 작게 합니다. (0.1 또는 0.01 정도로 하시면 되겠습니다.)

범위를 나타내는 벡터입니다. 

 

meshfgird() 명령으로 좌표값들을 나타내는 x, y좌표를 찾고 

이 행렬 x, y의 좌표값들을 이용해서 z좌표를 구한다.

x, y를 썼다고 해서 x, y를 입력해서는 안됩니다.

좌표값들은 X, Y 행렬에 들어있기 때문입니다.

마지막 줄에  mesh라고 쓰여있기는 한데 그렇게 하지 말고  surf함수를 사용해서 곡면 그래프를 그려야 합니다.

 

(유한 엔터)

 

 

전체 코드와 결과 화면입니다.

 

 

%예제 11번 c에 대한 코드입니다.
x=[-2:.1:2]
y=[-2:.1:2]
[X,Y]=meshgrid(x,y)
Z=exp(-(((X).^2)+((Y).^2)))
surf(X,Y,Z)
grid on
title('example 11 c surf plot')
gtext('example 11c','FontSize',20)

 

 

 

 

 

 

 

 

 

 

이렇게 하면 3차원 그래프 그리는 방법에 대해서 잘 알게 될 것입니다.

 

 

 

 

04 07 끝

반응형
Comments