이미 매트랩으로 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로만 표현된 것이라 볼 수
있습니다.)
그래프는
2차원 그래프 그리기, 3차원 그래프 그리기, 도형 그리기 요렇게 3 파트로 나눠서 해볼까 하는데
오늘은
먼저 2차원 그래프 그리는 것 부터 해볼까 합니다.
요런 2차원 그래프도 표현이 당연히! 가능합니다.
후후 아름답군요. 엘레강스합니다.
위에 나온 그래프 중에서 가장 빈티나는(...) 2차원 그래프부터 그려보는 걸 한번 해볼까 하는데요.
그래프 그리는 순서는 다음과 같습니다.
1)
x축 데이터 정하기(벡터로 표현). 2)
y값을 x 값을 이용하여 나타내기. 3)
plot명령어를 사용하여 그리기. 4)
추가적인 옵션(그래프 색, grid, x,y이름표 붙이기, 그래프 이름, 범례 표시 등등)
주로 제가 사용하는 방법은 위의 형식입니다. 물론 다른 방법도 있습니다만...! 하나하나 차근히 해보도록
해요.
일단 예를 한번 들어보겠습니다.
y=3*x 그래프를 그려보도록 하겠습니다.
1)
x 데이터 지정하기(벡터로 표현)
그리고자 하는 x축 범위를 예를 들어 -3~3 까지 나타내고 싶다고 합시다. 이때
주의할 점은 x축
데이터를 벡터로 표현해야 한다는
것입니다.
왜냐고요?
매트랩이 그래프를
그려주는 원리를 일단 설명을 해야 할 것 같네요.
매트랩이 2차원 그래프를 그리기 위해선 데이터가 2 세트가 필요합니다.
x 데이터와 그에 대응하는 y 데이터죠.
예를 들어 x = [ 1 2 3 4 5] 라는 데이터가 있고 y=[2
4 6 8 10] 이라는 데이터가 있다면
x의 첫번째 데이터와 y의 첫번째 데이터를 하나의 세트로 생각해서 (1,2)를 그래프에 나타내줍니다. 마찬가지로 x의
두번째 데이터와 y의 두번째 데이터를 하나의 세트로 생각해서 (2,4)를 그래프에 나타내줍니다. 역시나
마찬가지로 (3,6),(4,8),(5,10)을 그래프에 찍어주는 형태입니다.
즉, x데이터와 y의 데이터를 순서대로 1:1 대응을 시켜서 그래프를 그려주는거죠.
따라서 x
데이터와 y의 데이터는 벡터의 형태 (1,m 크기의 행렬)로 표시되어야 하며, 두개의 크기가 같아야 합니다.
물론 위의 경우는 점으로 표시되지만, plot명령어를 쓰게되면 그 사이를 선으로 연결시켜 줍니다.
직접 매트랩 명령어와 그래프를 보여 드릴게요. x와
y를 벡터로 나타낸 다음, plot이란 명령어를 썼습니다.
>>
x=[1 2 3 4 5]; >>
y=[2 4 6 8 10]; >>
plot(x,y)
네
요렇게 나와주시는걸 볼 수 있습니다.
기본적으로 plot명령어는 파란색 선으로 그려주기 때문에 위와 같이 나타나지만 다르게도 표현할 수 있습니다.
자, 여튼 데이터를 나타내기 위해서 벡터 형식으로 나타내야 한다는 것은 아시겠죠?
그런데, -3~3 까지 그리기 위해서 벡터형식으로 나타내려면 숫자를 일일이 쳐줘야 한다는 단점이 있습니다.
x=[-3 -2.99 -2.98 ..... 2.99 3]
요런식으로 둬야 하는데 말이죠.
하지만 현실적으로 일일이 칠 수가 없기 때문에!! 바로 입력하는 방법이 있습니다. 바로 요렇게 말이죠.
x=[시작
값 : 데이터 하나당 크기 : 끝값]
예를 들어 볼게요.
>>
x=[-3: 1: 3]
x
=
-3 -2 -1 0 1 2 3
쉽죠? -3에서 3까지 1의 단위로 벡터를(혹은 행렬을) 만들어 줘라는 의미가 됩니다.
위에서 x데이터와 y의 데이터를 1:1대응을 해서 나타낸다고 했으므로, 데이터가 촘촘할수록 더 정확한 그래프가
그려지겠죠?
y=3*x를 나타내기 위해 여기선 x의 범위를 -3에서 3까지 0.01씩 지정할게요.
>>
x=[-3:0.01:3];
2)
y값을 x 값을 이용하여 나타내기
y=3*x의 그래프를 그리고 싶습니다. x는 벡터로 지정되었기 때문에, 이제는 y를 벡터로 지정해줄
차례입니다.
단순히 >>
y=3*x;
요렇게 쳐도 괜찮습니다만, 요전 앞 강의에서 행렬의
성분마다 계산!!! 을 하기 위해서는 점!!
'.' 을 찍어야 한다는 것. 잊지
않으셨죠?
위의 경우는 숫자 곱하기 벡터라는 단순한 상황이기 때문에 위의 명령어도 먹혀 들어가지만,
2차 그래프나 3차그래프, 분수 등의 다른 형태가 나오게 되면 안되는 경우가 태반이기 때문에, 항상
점 '.'을 찍어주시는 것을 습관화합시다.
즉 요렇게 저는 칠께요.
>>
y=3.*x;
이렇게
되면, y는 x라는 벡터에 3을 곱한 결과를 가지는 벡터가 되는 것입니다.
3)
plot명령어를 사용하여 그리기 앞에서
이미 설명을 해버렸지만, plot(x,y) 이라는 명령어를 쓰면 x 데이터와 y 데이터를 1:1 대응을 시켜서 그래프를 매트랩이 알아서 그려주게
됩니다. 요렇게 입력해주면 되겠죠?
>>plot(x,y)
여기까지 하면 이런 그래프가 나오게 됩니다. >>
x=[-3:0.01:3]; >>
y=3.*x; >>
plot(x,y)
[축하드립니다!!
그래프 그리기 기본 스킬을 습득하셨습니다.]
여기까지 하면 그래프 그리기는 사실상 99% 정도는 끝난거지요.
이제
여기서 그래프를 스리슬쩍 꾸미면 2차원 그래프는 완성되게 됩니다.
4)
추가적인 옵션(그래프 색, grid, x,y이름표 붙이기, 그래프 이름, 범례 표시 등등)
살짜쿵 위의 그래프를 꾸며볼까요? 일단 색깔과 형태를 바꿔 볼게요. 명령어는
다음과 같습니다. plot(x,y,'색깔') 색깔 부분에는 빨간색이면 'r' 초록색은 'g' 노란색을 'y'등으로 나타낼 수 있어요. 한번 빨간색으로
해볼께요.
>> plot(x,y,'r')
쉽죠? 형태도 바꿀 수 있습니다. 점이나 +, 사각형, 원 등으로 표현할 수도 있어요. 색깔 치는 부분에 형태에 관한
명령어나,'색깔,형태'의
형식으로 나타내주면 됩니다. 한번 보여 드릴게요. (형태에
관한 명령어 점 -> . 사각형 ->s 원->o 등등. help plot을 치면 쉽게 알 수 있습니다.)
>>
plot(x,y,'ro')
데이터 개수가 많아서 원이 겹쳐 굵은 선으로 보이는 군요. 데이터 개수가 적으면 원으로 보입니다 하핫
다음은 다른 옵션들을 적용해볼게요. 순서대로 적용하겠습니다.
x축 이름 표시 (xlabel('이름')) y축
이름 표시 (ylabel('이름')) 그래프
제목 표시 (title('이름')) 경계
조절(그래프 나타낼 범위 조절) (axis([x최소 x최대 y최소 y최대]) 그리드
표시 (grid on)
매트랩(MATLAB) 프로그램은 미국의 The Mathworks Incc 에서 만든 과학기술 분석 프로그램으로 기존의
프로그래밍 언어보다 훨씬 쉽게 배우고 사용할 수 있다. MATLAB은 MATrix LABoratory의 약자로 알려져 있으며, 그 의미는 모든
연산을 벡터(vector)기반으로 행렬(matrix)처럼 처리한다는 것이다.
현재는 업그래이드 버전이 나와있으나, 여기서는 버전 6.1을 사용한다. 버전 7.1과 6.1은 기능면에서 크게 차이나지
않는다.
1.1 매트랩 기초중의
기초!
매트랩 프로그램을 실행하면 아래와 같은 명령 프롬프트(command prompt)가 생성된다.
가장 간단한 매트랩 사용법으로 다음과 같이 사용할 수 있다.
>>77
- 66
그
결과는 다음과 같이 출력된다.
ans=
11
위의
경우와 같이 매트랩은 항상 그 결과 값을 ans 라는 변수에 저장한다. 그러므로 다음 프롬포트에서 ans 라는 변수를 바로 사용할 수도
있다.
>>
ans +22
ans
=
33
위처럼
출력된다. 위와같이 매트랩은 사용자가 별도의 변수에 결과 값을 저장하지 않을 경우 디폴트(default)로 ans 변수를 사용한다.
벡터가
아닌 스칼라(scalar) 값을 사용자가 선택한 변수 a 에 저장하는 방법은 다음과 같다
>>
a = 11
이
경우 다음과 같이 화면에 출력된다.
a=
11
만약
연산의 결과를 화면에 출력하고 싶지 않을 경우에는 세미콜론(;)을 사용하면 된다.
>>A
= 22;
여기에서
소문자 a와 대문자 A는 전혀 다른 변수이다. 다시말해 매트랩에서 사용하는 변수는 case-sensitive이다.
여러개의
대입문 혹은 명령문을 한 줄에 처리할 수도 있는데, 이 경우에는 각각의 문자을 콤마(,)로 분리한다.
>>a=11,
A= 22;
그
결과는 다음과 같이 출력된다.
a=
11
*A는
뒤에 세미콜론(;)이 붙었기 때문에 화면에 출력되지 않는다!
who라는
명령어의 사용법도 기억해 둘 필요가 있다.
who명령어는
현재 메모리에 저장된 변수명을 보여준다.
예를
들어 매트랩을 시작한 이후 지금까지 예제로 보여준 명령만을 실행하였다고 가정하고 who 명령을 시행할 경우 아래와 같이 출력된다.
>>who
Your
variables are:
A
a ans
즉
지금까지 사용한 변수 A와 a, 그리고 앞부분의 연산 결과인 33이 ans 변수로 저장되어 있음을 확인할 수 있다.
그리고
각 변수에 저장되어 있는 값을 확인하려면 명령 프롬프트에서 그 변수명을 입력하면 된다.
예를
들어 A에 저장된 값이 무엇인지 알고 싶다면 아래와 같이 할 수 있다.
>>A
A=
22
이미
매트랩에서 정의된 변수들이 있는데, 예를 들어 pi를 다음과 같이 사용할 수 있다.
>>pi
ans
=
3.1416
이처럼
매트랩은 디폴트로 소수점 이하 4자리 까지 표시한다.
만약
더 많은 소수이하자리수를 보여주고자 할 때에는 format long 을 사용하면 된다.
long의
경우에는
>>pi
ans=
3.14149265358979
이를
다시 디폴트로 되돌리려면
>>format
short
를
이용해주면 된다.
help
(원하는 명령어) 를 이용하면 비교적 상세한 명령어 사용법을 배울 수 있다.
예를들어
format 명령어에 대하여 더 상세한 설명과 옵션을 알고싶다면 help format 을 입력하면되고 다음과 같이 실행된다.
clf %clear figure x = linspace(0,10*pi,1000); y = cos(x); z = sin(x); plot3(x,y,z) grid on % 기준선 그리기. grid off로 해제 가능 xlabel('x') ylabel('y') zlabel('z')
회전해보았습니다.
x랑 y축 위치가 바뀌었죠? 돌리다보면 헷갈림. label필수.
II. 3D surface plot : mesh, surf, Contour, surface contour
네 가지 종류의 표면 플롯을 간단히 구현할 수 있습니다.
clf x = -2:0.2:2; y = -2:0.2:2; [X,Y] = meshgrid(x,y); Z = X.*exp(-X.^2 - Y.^2);