매트랩 사용법 참고

 

http://cafe.daum.net/cyberna

반응형

출처: 인하대학교 지리정보공학과 원지혜 박사님 수업자료

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% 2012911일자 과제 제출

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

clear all

%혹시 모르는 사전에 저장되어있는 변수로 인한 오류를 막기위해 선언

clc;

%실행시 명령 프롬포트창을 클리어

tpeak=205;

w=2*pi/365;

%기본 변수 선언

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%배열로 입력받기위한 공간할당 및 수 입력

T=zeros(5,366);

%zeros함수를 이용하여 5366열의 배열에 0을 채워넣어 초기화

%-이해가 안가신다면 앞서 작성해놓은 포스팅참고하세요 :)

Tmean=[22.1 23.1 5.2 10.6 10.7];

Tpeak=[28.3 33.6 22.1 17.6 22.9];

%각각의 도시별 값을 입력해줌

TM=zeros(1,5);

sum=zeros(1,5);

%마찬가지로 초기화

p=0:365;

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%for문을 통한 일일평균 온도 계산

for j= 1:5

for k= 1:366

t= k-1;

T(j,k)=Tmean(j)+(Tpeak(j)-Tmean(j))*cos(w*(t-tpeak));

sum(j)= sum(j)+T(j,k);

end

TM(j)=sum(j)/365;

end

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%도시별 평균온도의 계산값 출력

fprintf(1,'Miami 의 평균온도 %9.3f d\n', TM(1) )

fprintf(1,'Yuma 의 평균온도 %9.3f d\n', TM(2) )

fprintf(1,'Bismarck의 평균온도 %9.3f d\n', TM(3) )

fprintf(1,'Seatle 의 평균온도 %9.3f d\n', TM(4) )

fprintf(1,'Boston 의 평균온도 %9.3f d\n', TM(5) )

%fprintf명령어가 이해가 안가시는 분은 앞서 작성되어있는 포스팅 참고요망

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%그래프 그리기

plot(p,T(1,:))

%그래프의 x 범위는 p y범위는 도시의 날짜별 온도의 범위

hold on

%hold on 함수는 다른 그래프가 그려져도 지워지지 않고

%남아있도록 해주는 명령어입니다.

plot(p,T(2,:),'r') %빨강으로

hold on

plot(p,T(3,:),'g') %초록으로

hold on

plot(p,T(4,:),'y') %노랑으로

hold on

plot(p,T(5,:),'m') %마젠타로

hold on

grid

%그리드 함수는 그래프에 격자를 그려줍니다

title('키키키XD 과제1')

%타이틀은 말그대로 그래프에 타이틀을 부여합니다.

ylabel('Temperature')

xlabel('Days')

%각각의 축에 라벨을 붙여주는 명령어인 x,ylabel 명령어입니다.

legend('Miami','Yuma','Bismarck','Seatle','Boston')

%범례를 그려주는 legend 명령어입니다.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

직접 작성한 코딩이기 때문에 전문성은 다소 떨어질 수 있습니다.

코딩에 대하여 질문 및 오류 발견시 댓글 받습니다 !:)

코딩에 정답은 이거야! 이런것은 없어요 ~ 개인 스타일에 따라 코딩은 천차만별이랍니다

1. command window 에서의 출력화면




2. 그래프 생성화면 (노란색이 흐릿해서 잘 안보이네요 :0;;)



반응형

http://blog.naver.com/potheymd/50149717902

매트랩 기초 2.5 - 파일 읽기와 쓰기

매트랩 기초, 매트랩, 매틀랩, 매틀랩기초, 매트랩기초, Matlab, matlab, 수치해석, 수치해석기초

매트랩을 이용해서 데이터 파일을 읽고 쓰는 작업을 자주하게 되므로, 간단하면서도 효율적인 파일 조작에 대해 배워야 한다.


Load 함수

가장 간단한 파일 읽기 방법은 load 함수를 이용하는 것이다.

현재 작업 중인 디렉터리에 올려놓은 텍스트 첨부파일을 저장한다 ('inhaUpop.txt')

현재 작업중인 폴더에 저장되어있지않을경우 매트랩은 실행되지 않는다

대게 따로 정하지 않은 이상 MATLAB 폴더가 디폴트이며 현재 작업폴더를 다음과같이 도구창에서 확인가능하다.


'inhaUpop.txt' 에는 다음과 같이 네 줄의 데이터가 동일한 형식으로 저장되어있다.

2003 17027

2004 17505

2005 17698

2006 17832

'inhaUpop.txt'는 2003년부터 2006년까지 인하대학교 학부생 수를 나타내고 있다. 첫번째 열은 년도, 두번째 열은 총 학생 수이다.

'inhaUpop.txt' 를 읽기위해 명령 프롬프트에서 load 명령을 실행한다.

>> load 'inhaUpop.txt'

명령을 실행한 뒤에 명령창에는 별다른 내용이 표시되지 않는다.

이 상태에서 who 명령을 수행하면 현재까지 생성된 변수 외에 새로이 inhaUpop가 만들어 졌음을 알 수 있다

변수 inhaUpop의 내용은 아래와 같이 확인 가능하다

>> inhaUpop


inhaUpop =


2003 17027

2004 17505

2005 17698

2006 17832

이처럼 load 명령을 사용해 읽은 데이터 파일은 파일의 확장자를 제외한 이름의 변수에 그 내용이 저장된다.

그러므로 다음과 같이 변수 이름 inhaUpop를 이용해 그래프를 그릴 수 있다.

>> plot(inhaUpop(:,1),inhaUpop(:,2),'o:')




fscanf 함수

파일을 읽는 방법으로 load보다 다양한 기능과 옵션을 가진 함수는 fscanf이다. fscanf의 사용법은 다음과 같다

  • 여기서 fid는 파일 ID의 의미로 읽은 파일에 붙여지는 ID로 해석하면 된다.
  • format은 데이터 형식을 설정해주는 부분이다. fprintf처럼 %d와 %f 등을 사용한다.
  • size는 데이터의 크기를 배열 크기처럼 [mXn]으로 정해주는 것이다.

fscanf 함수의 리턴값은 두개인데, 대부분 count없이 a만 명시한다.

결과로 저장된 데이터는 행렬 a로 리턴되고, count 는 성공적으로 읽은 데이터 개수를 말한다.


그런데, 작업 대상인 데이터 파일의 fid를 얻기 위해서는 먼저 fopen 을 사용해 파일을 열어야 한다. fopen의 일반적인 사용법은 다음과같다.


fid = fopen (Filename, Permission)

  • 여기서 Filename은 읽고자 하는 파일 이름을 의미한다
  • Permission은 읽는 파일에 대해 허용된 기능을 의미한다.

일반적으로 읽기(read)만 하고 수정 혹은 첨부하지 않을 때는 'r'을 선택한다. 가능한 permission의 옵션을 보려면 help fopen을 사용한다.


다음 명령으로 inhaUpop.txt의 fid를 부여받을 수 있다.

>> fid = fopen ('inhaUpop.txt','r')


fid =


3

만약 ()안에 명시한 파일이 존재하지 않을 때는 fid가 -1로 반환된다.

앞의 명령으로 부여받은 fid로 inhaUpop.txt를 배열 a로 저장하는 방법은 다음과 같다.

>> [a,count]=fscanf(fid,'%d%d',[2 4])


a =


2003 2004 2005 2006

17027 17505 17698 17832



count =


8

위의 명령에서 size에 해당하는 [2 4]에 주의해야한다.

fscanf명령은 열(column)-행(row) 순서로 데이터 파일을 읽기 때문에 열의 개수를 먼저 명시해야 한다.

inhaUpop.txt는 두개의 열과 네개의 행으로 되어있으므로 [2 4]로 size를 정했다.

만약 읽어들이는 데이터 파일의 열의 개수는 알지만 행의 개수가 많아서 구태여 개수를 세어 값을 정하지 않기 위해서는

행의 수에 inf를 사용한다. 즉 데이터 파일이 2개의 열로 구성되었다면 size 부분에 [2 inf]를 쓴다.


fscanf의 결과로 저장된 a 행렬은 실제 데이터 파일 형태의 전치행렬이다. 따라서 다음과 같이 a 행렬을 전치시켜 사용하는 것이 일반적인 방법이다.

전치된 행렬을 사용해 load 로 읽어 그린 그래프와 동일한 그래프를 그릴 수 있다.

>> a= a'


a =


2003 17027

2004 17505

2005 17698

2006 17832


>> plot(a(:,1),a(:,2),'o:')


예제의 경우에는 열린 파일 inhaUpop.txt를 닫을필요는 없지만 매트랩 프로그램이 복잡해질수록,

작업이 종료된 파일은 닫아주는 것이 좋다. 열린 파일을 fid를 이용해 닫는 방법은 다음과 같다

fclose(fid);

만약 여러개의 파일이 열려있는 상태라면 한 번의 명령으로 모든 파일을 닫는 것이 편ㄹ하다.

이 경우는 fclose all; 을 사용한다.


반응형

http://blog.naver.com/potheymd/50149714027

매트랩 기초 2.3 - 벡터화 (vectorization)

for문은 쉽게 구현할 수 있고 이해하기도 쉽다는 장점이 있지만, 매트렙에서 특정한 작업을 반복하는 데 있어 효율적인 방법은 아니다.

매트랩은 행렬을 대상으로 직접 연산이 가능하기 때문에 벡터화가 훨씬 더 효율적이다.

예를 들어 다음 프로그램을 살펴보자.

j=0;

>> for t = 0: 0.01:40

j=j+1;

y(j)= cos(t);

end

이 프로그램은 4001개의 t값을 생성하고 각 t의 cosine 값을 y벡터에 저장한다.

이 과정을 다음과 같이 벡터화 프로그램으로 변환할 수 있다.

t= 0:0.01:40;

y=cos(t);

벡터화 프로그래밍으로 생성한 y 벡터는 위에서 작성한 일반 프로그래밍 기법보다 효율성이 우수하고 처리 속도도 빠르다.

매트랩 프로그램은 가능한 경우 벡터화를 하는 것이 좋다.



매트랩 기초 2.3 - 메모리할당

매트랩은 배열에 새로운 원소를 할당할 때마다, 배열의 크기를 자동적으로 늘리도록 설계되어있다.

이러한 이유 때문에 만약 루프구조에서 매번 배열의 원소를 하나씩 늘려간다면, 상당한 시간이 소요된다.

예를 들어 다음과 같은 프로그램을 살펴보자.

>> t=0:0.01:5;

for j=1:length(t)

if t(j)>1

y(j)=1/t(j);

else

y(j)=1;

end

end

이 경우 매트랩은 배열 y의 크기는 새로운 값이 대입될 때 마다 바뀌게 된다.

배열의 크기가 매번 변경되면서 메모리 크기도 같이 조정되어야 하므로 당연히 비효율적인 프로그램이 된다.

이런 비효율성을 피하기 위해 아래와 같이 미리 사용하고자 하는 배열의 크기를 정해, 루프가 반복되더라도 메모리 크기가 변하지 않게 해야한다.

>> t=0:0.01:5;

y=ones(length(t),1);

for j=1:length(t)

if t(j)>1

y(j)=1/t(j);

else

y(j)=1;

end

end

반응형

http://blog.naver.com/potheymd/50149488346 에서 일부 발췌

사용자가 원하는 가로 및 세로축의 범위를 정하기 위해서는 axis 명령어를 사용할 수 있다.


한 페이지에 그림을 두 장 같이 그릴 경우에는 subplot 명령어를 사용하면 된다.

subplot은 주어진 페이지를 행렬처럼 분할한다.

예를 들어보자

>> subplot(2,1,1)

>> plot(t,sin(t))

>> axis([0 2*pi -1. 1.])

>> ylabel('Sine')

>> title('Sine Function')


>> subplot(2,1,2)

>> plot(t,cos(t))

>> axis([0 2*pi -1. 1.])

>> title('Cosine Function')

>> ylabel('Cosine')

>> xlabel('Values of t')

예로 든 (2,1,1)은 2X1행렬의 첫 원소처럼 공간이 할당되는 셈이다. 따라서 하단의 그림은 두 번째 원소 (2,1,1)처럼 공간을 차지한다.


따라서 그래프는 다음과 같이 그려진다.

반응형

http://blog.naver.com/potheymd/50149488346

plot함수는 그래프에서 사용되는 기호와 선의 모양을 다양하게 선택할 수 있다.

아래의 표는 몇가지 중요한 선택사양을 설명하고 있다.

심벌

Blue

b

point

.

solid

-

Green

g

Circle

o

Dotted

:

Red

r

X

x

Dashdot

-.

Cyan

c

Plus

+

Dashed

--

Margenta

m

Star

Yellow

y

Square

s

Black

k

Diamond

d

Triangle(down)

v

Triangle(up)

^

Triangle(left)

<

Triangle(right)

>

Pentagram

p

Hexagram

h


위의 선택사항과 라벨 등을 붙인 예는 다음 아래의 그림과 같다.

>> t=0:0.1:2*pi;

>> plot(t,sin(t))

>> plot(t,sin(t),'d')

>> xlabel('Values of t')

>> ylabel('Sine')

>> title('Sine function')

>> grid  

반응형

매트랩 복소수 문자 배열등등 첨부 --> pdf 파일

http://164.125.37.225/~dhlee/wiki/images/3/37/AM10-lect08-4s.pdf 에서 다운

반응형

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)라고 해도 그래프는 똑같이 그려집니다!! 혹여나 햇갈리실까 하여....

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


반응형


[Matlab / 매트랩] 강의 3번째

2차원 그래프 그리기 (2D graph)

우왕ㅋ 굿ㅋ 번개같은 업뎃입니다!!!!!!.............(은)는 훼이크고

사실을 금욜날 3강까지 업뎃할 예정이었습니다... 흐흑ㅠ 이미 한참 지나버렸네요 흐흑ㅠ

어찌되었건 은근슬쩍 넘어가서 이번부터는 그래프 그리는걸 한번 배워보도록 해요.

그래프는 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)

>> xlabel('x axis')
>> ylabel('y axis')
>> title('graph')
>> axis([-2 2 -8 8])
>> grid on


여러가지 옵션들이 적용된 것을 볼 수 있죠?





ref http://engi-agora.tistory.com/6 에서 일부 발췌

반응형



매트랩(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 을 입력하면되고 다음과 같이 실행된다.




ref : http://blog.naver.com/potheymd/50149480337

반응형

http://cafe.naver.com/mhjune/31


MATLAB의 기본

그래프(2D)

>> plot([1 2 3],[4 5 6])

(commend 창에 치세요)

>> (xlabel('시간'))

>> (ylabel('속도'))

그래프에 눈금을 넣어주는것 >>grid

제목 넣어주는 것 title(' ')

선의 모양 및 색깔 넣어주는 것 plot([ ],[ ],[' '])

':' , '-.' , '--' , '--r' , '*k' 등등

plot([1 2 3],[4 5 6],['--r'])

이제부터 한 그래프안에 여러개의 그래프를 넣는 방법

plot([1 2 3],[4 5 6 ],['-r'],[1 2 3],[8 9 10],['--b'], [1 2 3],[1 2 3],[':k'])

그래프안에 선의 이름을 정해 주는 것

legend('x1-date','x2-date','x3-date')

경우에 따라 그래프를 겹쳐야 할때도 있고 뺄때도 있으므로 이럴땐

이런 방법을 사용함

>> plot([1 2 3],[4 5 6],['--r'])

>> hold on

>> plot([1 2 3],[8 9 10],['-b'])

>> hold on

해제를 시킬 경우는

>> hold off

>> plot([1 2 3],[8 9 10],['-b'])

>>

그래프를 별도의 figure에 해야 될 경우

>> figure(1)

>>

>> plot([1 2 3],[1 2 3],['*b'])

>> figure(1)

이 figure(1)에 대한 그래프가 나오고

>> figure(2)

>>

>> plot([1 2 3],[1 2 3],['--b'])

>> figure(2)

이 figure(1)에 대한 그래프가 나옵니다.


하나의 figure에 안에 따로 따로 모았을 경우

>> subplot(221)

>> plot([1 2 3],[1 2 3],['--b'])

>> subplot(222)

>> plot([1 2 3],[4 5 6],['-b'])

>> subplot(223)

>> plot([1 2 3],[8 9 10],['*b'])

>> subplot(224)

>> plot([1 2 3],[8 9 10],[':b'])



subplot(221)의 의미는

앞에 22는 행과 열의 의미이여 뒤에 1은 행과 열의 순서라고 보면 됩니다.

횡일때는 순서를 왼쪽에서 오른쪽으로 잡으며 종일때는 위에서 밑으로 합니다.


연습문제

>> t=[0:0.1:20+pi];

>> subplot(221)

>> plot(sin(t))

>> xlabel('t'),ylabel('sin(t)')

>> subplot(222)

>> plot(cos(t))

>> xlabel('t'),ylabel('cos(t)')

>> subplot(223)

>> syms t

>> ezplot(tan(t))

>> xlabel('t'),ylabel('tan(t)')

>> subplot(224)

>> ezplot(t)

>> xlabel('t'),ylabel('t')

>> figure(2)

>>

>> t=[0:0.1:20+pi];

>> plot(t.^2+2*t+1)

>> xlabel('t.^2+2*t+1'),ylabel('t')

>>

3D그래프 (축이 3개)

>> plot3([1 2 3 4],[5 6 7 8],[9 10 11 12])

>> x=[0:pi/50:pi];

>> y=[0:pi/50:pi];

>> z=sin(x)+cos(y);

>> plot3(x,y,z)

>> grid

>>

[삼차원]mesh:(y의 한지점을 기준으로 해서 x의 모든 경우의 수를 고려해서 그때의 축을 만들어줌)

함수를 만들기 전 meshgrid를 먼저 만들어 줘야 한다.

>> x=[0:pi/50:pi];

>> y=[0:pi/50:pi];

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

>> mesh(X,Y,sin(X)+cos(Y)) (삼차원 그래프가 등장)

>> surf(X,Y,sin(X)+cos(Y))(z의 값에 따라 색이 다름)


>> surfc(X,Y,sin(X)+cos(Y)) (2D+3D로 등곡선 표시)

>> colorbar(X,Y,sin(X)+cos(Y)) (값에 따른 색상 표시)


>> contour(X,Y,sin(X)+cos(Y)) (등곡선만 2차원으로 표시

반응형

pdf 파일


http://web.yonsei.ac.kr/hgjung/Ho%20Gi%20Jung%20Homepage/Lectures/2011%20Fall%20PME/2B%20MATLAB%20%EA%B8%B0%EC%B4%88%20%EC%82%AC%EC%9A%A9%EB%B2%95.pdf

반응형


[매트랩(Matlab)] 11. Meshgrid & 3차원 그래프(3D plot)  Matlab / 서바이벌 

2011/03/17 15:30

복사http://psahnwoo.blog.me/110105012447


 

 

I. Meshgrid

 

이게.. 뭘 쓰기가 참 거시기 한 게.. 이걸 언제 써야 잘 쓰는 건질 모르겠어요.

행렬 곱셈 할 때 속도가 빨라지긴 하던데. (이게 주 목적인 거 같긴 하다..)

그래서 그냥 글 하나를 스크랩 해 옴.. (목록 봐도 나오고 링크는 여기:http://blog.naver.com/horgan/40004255437)

 

 내가 아는거 라곤

 

X = 1:5; Y = 6:10; 의 두 벡터가 있을 때

meshgrid를 이용하면 아래와 같이 나온다는 것 뿐.

 

 EDU>> X = 1:5; Y = 6:10;
EDU>> [x,y]=meshgrid(X,Y)

x =

     1     2     3     4     5
     1     2     3     4     5
     1     2     3     4     5
     1     2     3     4     5
     1     2     3     4     5


y =

     6     6     6     6     6
     7     7     7     7     7
     8     8     8     8     8
     9     9     9     9     9
    10    10    10    10    10

 EDU>> [x,y] = meshgrid(X)

%meshgrid(X) = meshgrid(X,X)

x =

     1     2     3     4     5
     1     2     3     4     5
     1     2     3     4     5
     1     2     3     4     5
     1     2     3     4     5


y =

     1     1     1     1     1
     2     2     2     2     2
     3     3     3     3     3
     4     4     4     4     4
     5     5     5     5     5

 

 

 

II. 기본적인 3D plot : Line Graphs

 

2D 그래프 그릴 때와 비슷합니다. 축이 하나 더 생긴 것 뿐이죠..

plot3명령어를 이용합니다.

 

 X = 1:10
Y = 2*sin(X)
Z = exp(X)
plot3(X,Y,Z)

 

%그래도 헷갈리니까 웬만하면 label 하는 습관을~

 

좀 제대로 재밌는 모양으로..

 

 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);

%Subplot 을 이용한

%네 가지 surface plot 구현

 

subplot(2,2,1)
mesh(X,Y,Z) %mesh
title('Mesh')


subplot(2,2,2)
surf(X,Y,Z) %surface
title('Surf')


subplot(2,2,3)
contour(X,Y,Z) %contour
title('Contour')

subplot(2,2,4)
surfc(X,Y,Z)

%surface와contour가

%동시에 나타남
title('Surfc')

 

 %colormap 색을 바꿀 수 있다.

%자세한 건 help에서

%colormap 검색

 

 

 colormap('bone')


colormap('winter')

 

 clf
colormap('jet') 
%matlab default colormap


pcolor(X,Y,Z)
colorbar

%색변화를 이용해 2D그래프로

% 3D를 나타냄

%colorbar을 이용해 색 확인

 

반응형

+ Recent posts