일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- Inkscape
- HTML5.
- 프로그래밍 언어
- 선형대수학
- C
- 나무위키
- 점자
- python
- Java
- Nemeth Braille
- html5
- 글이_점점_짧아지고_있습니다.
- CSS
- 수학
- IT
- javascript
- 리브레위키
- 자바스크립트
- LaTeX
- 물리학
- css3
- 오늘의 문제
- ┌─┐
- 프로그래밍
- C언어
- 위키
- matlab
- html
- C++
- 확률
- Today
- Total
SturdyCobble's Study Note
[MATLAB] 04. 2D, 3D 그래프 본문
NOTICE : 독학인 만큼, 잘못된 내용이 있을 수 있습니다. 내용 지적은 언제나 환영합니다.
더 이상 이 블로그에는 글을 올리지는 않을 예정입니다. 그렇지만 댓글을 달아주시면 최대한 답변드리고자 노력하겠습니다.
※ 이 글은 최소한 Python과 같은 프로그래밍 언어를 한 번 이상 접한 사람을 독자로 가정하여 작성되었습니다. 사용버전은 R2019a기준입니다. 또한 기본적인 프로그램 조작보다는 프로그래밍에 초점을 맞추어 작성하였습니다.
MATLAB의 또다른 특징은 별다른 라이브러리 없이 그래프를 그릴 수 있다는 점입니다. Python의 경우 matplotlib과 같은 라이브러리가 필요한 반면에 공학용 언어인 만큼 기본적으로 지원을 해줍니다.
다음 함수의 그래프를 0부터 2pi사이 범위에서 그려봅시다. 이때 점 사이 간격을 pi/10으로 계산해봅시다.
$$y = \sin(x^{2})$$
x = 0:pi/10:2*pi;
y = sin(x.^2)
plot(x,y)
위와 같이 그래프가 나오긴 했는데, 간격이 너무 넓어서 부정확한 그래프가 얻어졌습니다. 좀 더 간격을 좁혀서 다시 시도하면 다음과 같습니다.
x = 0:pi/100:2*pi;
y = sin(x.^2);
plot(x,y)
이제 좀 볼만한 그래프가 만들어졌습니다. 위의 코드는 아래와 같이 linspace함수로 대체가능합니다.
x = linspace(0,2*pi,200);
y = sin(x.^2);
plot(x,y)
이번엔 매개변수로 타원을 그려보겠습니다.
t = linspace(0,2*pi,200);
x = 2*cos(t);
y = sin(t);
plot(x,y)
약간 모양이 일그러져 보이는 것은 세로와 가로의 축척이 다르기 때문입니다.
다음과 같이 매개변수 3차원 그래프를 그려볼 수도 있습니다. (plot이 아닌 plot3를 사용합니다.)
t = linspace(0,8*pi,200);
x = cos(t);
y = sin(t);
z = t;
plot3(x,y,z)
이제 z=f(x,y)로 표시되는 곡면을 나타내겠습니다. 이 때는 다음과 같은 코드를 이용합니다.
[X, Y] = meshgrid(-1:0.1:1);
Z = exp(X+Y).*sin(X-Y);
surf(X,Y,Z)
또는 mesh함수를 통해 면이 아닌 격자만 표시되게할 수도 있습니다.
[X,Y] = meshgrid(-8:.5:8);
Z = sin(X+Y)./(X.^2+Y.^2);
mesh(X,Y,Z)
보다시피 메시에 커다란 구멍이 생겼습니다. 0에서 값이 정의가 안 되기 때문인데요, 이를 막기 위해 정밀도만큼 숫자를 더하여 구멍을 처리해 줄 수 있습니다. 즉 eps를 0으로 나누는 부분에 더합니다.
[X,Y] = meshgrid(-8:.5:8);
Z = sin(X+Y)./(X.^2+Y.^2 + eps);
mesh(X,Y,Z)
등고선(정확히는 contour)을 나타내려면 아래와 같이 contour3함수를 이용합니다. 이때 두번째 인자는 등고선의 갯수를 지정합니다.
[X Y] = meshgrid(-20:1:20);
Z = X.^2 + Y.^2;
contour3(Z,50)
이제 한 그래프에 여러개의 그래프를 넣거나, 한 창에 여러 그래프를 넣어보겠습니다.
x = 0:pi/100:2*pi;
K = (sin(x)).^2;
U = (cos(x)).^2;
E= K+U;
plot(x,K,x,U,x,E)
아래 코드를 위 코드에 더하면 범례를 추가할 수 있습니다.
legend('K','U','E')
이렇게 그렸는데, 또 추가하고 싶다면 hold함수를 이용한 뒤 추가해줍니다.
x = 0:pi/100:2*pi;
K = (sin(x)).^2;
U = (cos(x)).^2;
E= K+U;
plot(x,K,x,U)
hold on
plot(x,E)
(결과는 위와 동일)
여러개 그래프는 다음과 같이 나타냅니다.
[X,Y,Z] = sphere();
subplot(2,2,1); mesh(X); title('X');
subplot(2,2,3); mesh(Z); title('Z');
subplot(2,2,2); mesh(Y); title('Y');
subplot(2,2,4); mesh(X,Y,Z); title('XYZ');
이때, subplot(2,2,3)의 의미는 2×2에서 3번째라는 의미입니다.(행 우선으로 3번쨰)
figure함수를 통해 몇 번 창에 띄울 것인지 고를 수 있습니다.
x = 0:pi/100:2*pi;
K = (sin(x)).^2;
U = (cos(x)).^2;
E= K+U;
figure(1)
plot(x,K,x,U)
figure(2)
plot(x,K,x,U,x,E)
아래 예시는 두 개의 창을 띄웁니다.
이 상태에서 특정 화면을 리셋시키고 싶다면 아래와 같이 명령 창에 입력해볼 수 있습니다.
>> figure(1)
>> clf reset
이렇게 되면, 해당 창은 초기화됩니다.
그외 축과 그래프에 관한 여러가지 설정을 진행할 수 있습니다. 이에 관한 내용은 공식 문서를 참고해보세요.
https://kr.mathworks.com/help/matlab/learn_matlab/basic-plotting-functions.html (2D)
https://kr.mathworks.com/help/matlab/ref/annotation.html (주석 생성)
https://kr.mathworks.com/help/matlab/learn_matlab/creating-mesh-and-surface-plots.html (3D)
(일일이 쓰는게 귀찮기도 하지만, 찾아보면서 하는게 더 도움될 것이라 생각해 링크로 남깁니다.(그때 그때 필요한 설정을 봐가면서 익히셔도 좋을 것 같습니다.))
추가로 복소수 표시도 가능합니다. 이는 실수부를 x, 허수부를 y로 생각해 다음과 같이 그래프를 그릴 수 있습니다.
t = [0:pi/20:2*pi];
c = cos(t)+sin(t)*i;
plot(c)
'프로그래밍 > MATLAB' 카테고리의 다른 글
[MATLAB] 06. 벡터화와 사전할당 (0) | 2019.08.13 |
---|---|
[MATLAB] 05. 제어식과 논리 첨자 (0) | 2019.08.12 |
[MATLAB] 03. 행렬 인덱싱과 문자열 (0) | 2019.08.04 |
[MATLAB] 02. MATLAB의 행렬과 복소수 (0) | 2019.08.03 |
[MATLAB] 01. MATLAB의 기본 명령어와 변수 (0) | 2019.07.29 |