어떤 함수가 실행되면 기본 작업공간과 별도로 그 함수만의 작업공간이 생성되어 함수 내부에서 사용되거나 생성된 객체가 저장되게 된다. 그리고 함수의 실행이 끝나면 그 작업공간은 소멸되므로 함수 내에서 초기화된 변수는 함수의 실행 끝나는 시점에서 소멸된다. 함수 내부에서 사용할 수 있는 외부 변수는 다음과 같은 세 가지 경로로 전달된다.


       ❶ 입력 변수

       ❷ global로 선언된 변수

       ❸ 함수 내부에서 초기화되지 않고 호출된 곳의 workspace에서 정의된 변수


여기서 ❶과 ❷는 MATLAB에서도 동일하지만 ❸의 경우는 그렇지 않다. 함수가 호출되면 호출된 곳의 작업공간과는 별도로 그 함수만의 분리된 작업공간이 생성된다. 편의상 호출된 곳의 작업공간을 기본 작업공간(base workspace, BWS)라고 칭하겠다. 만약 함수 내부에서 어떤 변수를 참조하려고 하면 먼저 자신의 작업공간을 먼저 검색해보고 만약 없다면 기본 작업공간에서 찾아본다. 두 곳 모두에서 없다면 에러가 발생될 것이다.


예를 들어서 다음과 같은 함수가 정의되었다고 가정하자.


function y=fA(x)
         w=(w+1)^2 // (a)
         y=x*w // (b)
endfunction


이렇게 정의한 후


>> fA(1)


이라고 호출하면 에러가 발생된다. 왜냐면 (a)의 우변에서 쓰이는 변수 w는 현재의 workspace에서도 없고 기본 작업 공간에서도 초기화되지 않았기 때문이다.


[그림 1] 작업 공간의 개념도


하지만


>> w=1
>> fA(1)


와 같이 변수 w를 먼저 초기화한다면 이제는 4라는 결과값이 표시될 것이다. 한 가지 정말로 혼동하기 쉬운 것은 (a)의 우변의 변수 w는 기본 작업 공간에서 참조하고 좌변의 w는 이 함수 자신의 작업 공간에 새로운 변수로 초기화된다는 것이다. 따라서 (b)의 변수 w는 이렇게 새롭게 생성된 변수가 참조된다. 기본 작업 공간의 변수 w가 아님에 주의해야 한다. 이 변수 w와 기본 작업 공간의 변수 w는 별개의 것이므로 기본 작업 공간에서는 여전히 1값을 유지한다. 이렇게 기본 작업 공간에서 이미 초기화되어 있는 변수를 함수 내부에서 다시 초기화한 경우 “shadowed” 되었다고 하며 이 경우 기본 작업 공간의 변수를 접근할 수는 없게 된다.


[그림 2] 함수의 작업공간과 기본 작업공간은 분리되어 있다.


 만약 기본 작업 공간에서 변수 w를 global로 지정한 후 초기화했다면 어떤 일이 발생할까.


>> global w, w=1
>> fA(1)
>> disp(w)


이 경우에도 변수 w는 여전히 1값을 유지하며 global로 지정했더라도 함수 내부에서 그 값을 변경할 수는 없다. 즉, 앞의 경우와 동일하게 동작한다는 것이다. 그렇다면 함수 내부에서 여전히 기본 작업공간의 변수를 접근할 수 있는데 global로 지정해주어야 하는 필요가 있을까하는 의문이 생긴다. 일견 아무런 차이점이 없어 보이기 때문이다. 함수 내부에서 상위 workspace의 변수값을 변경해주려면 함수의 내부에서도 global로 지정해 주어야 한다.


function y=fB(x)
         global w
         w=(w+1)^2
         y=x*w
endfunction


이제


>> fB(1)
>> disp(w)


를 실행하면 변수 w는 4로 바뀐다. 즉, 상위 workspace의 변수 w가 fB()함수 내부에서 바뀐 것이다. 이와 같이 외부 변수의 값을 바꿀 필요가 있다면 외부에서뿐만 아니라 내부에서도 그 변수를 global로 지정해 주어야 한다.

[그림 3] 글로벌 변수의 동작 개념도


 함수의 결과값을 기본 작업 공간으로 내보내는 데에도 다음과 같은 세 가지 방법이 있다.


       ❶ 출력 변수로 반환하는 방법

       ❷ global로 지정된 변수를 이용하는 방법

       ❸ resume 혹은 return 명령의 인수를 이용하는 방법


❶ 은 함수의 정의부에서 선언한 출력변수를 통해서 기본 작업 공간으로 값을 내보내는 것이고 ❷는 직전 절에서 기술한 바와 같이 함수의 내부에서 global로 지정한 변수를 통해서 기초 작업 공간에서 접근할 수 있는 전역 공간에 변수값을 내보내는 방법이다.


 함수 내부에서 return 이나 resume을 만나면 그 즉시 함수가 종료되는데 보통은 단문으로 사용되어서 함수를 강제로 종료시키는 기능을 수행한다. 하지만 다음과 같은 문법도 가능하다.


[x1, x2, … xn] = return(a1, a2, … an)
[x1, x2, … xn] = resume(a1, a2, … an)

 

이러한 명령들은 함수 내부의 변수들 a1, a2, … , an 을 호출한 곳의 작업 공간에 변수 x1, x2, …, xn 으로 내보내는 기능을 수행한다. 예를 들면 다음과 같다.


function foo(a)
           a=a+1
           b=resume(a) //(*)
           c=52 // (**)
endfunction

 

이 예제에서 (**)줄은 실행되지 않고 (*)줄에서 함수는 종료된다. 또한 기본 작업공간에 변수 b를 생성시켜서 함수 내부의 a변수 값을 넘겨주게 된다. 따라서


>> foo(42)


라고 함수를 실행시키면 workspace에 변수 b가 43값으로 생성된다.


그렇지만 Scilab 매뉴얼(도움말)에 의하면 이러한 용법은 쓸데없이 프로그램의 복잡도만 증가시키므로 출력 변수를 이용하는 것이 바람직하다고 기술되어 있다. 따라서 가급적 ❶번 방법을 주로 사용하고 필요시 ❷번 방밥을 사용하도록 하는 것이 좋다. 또한, resume명령은 pause명령에 의해서 실행이 멈춘 함수를 다시 시작시키는 데에도 사용되는 명령이다.



Posted by 살레시오
,

 이전 포스트에서 plot()명령을 내리면 창이 자동으로 생성됨을 확인할 수 있다. 여기에서는 사용자가 임의로 여러 개의 그래프 창을 선택(생성)하고, 내용을 지우고, 창을 닫는 기능을 설명하도록 하겠다.


 그래프 창은 각각 고유의 아이디를 가지고 있다. 현재 열린 여러 개의 그래프 창들 중에서 특정한 아이디를 갖는 그래프 창을 선택하려면 scf() 함수를 호출하면 된다. (Set Current Figure)


>> scf(n) // n번 그래프 창 선택 (없으면 생성)
>> h = scf(n) // n번 그래프창 선택(없다면 생성) (h : 핸들)
>> scf() // (직전 아이디+1)을 가지는 새로운 그래프창 생성.
              (초기에는 0번이 생성됨)


이 함수를 사용하면 그래프 창이 선택되고 만약 지정한 아이디를 가지는 그래프창이 없다면 생성된다. 이후의 plot 명령은 이렇게 선택된 창에 그래프가 그려지게 된다. 그래프 창의 캡션바에 보면 이 아이디가 표시된 것을 확인할 수 있다.



이 아이디는 현재 그래프 창을 선택하거나 핸들(handle)을 얻거나(gcf 함수 이용) 창을 소멸시키는 등의 일을 할 수 있는 그래프 창의 고유 번호이다. 아이디로부터 핸들을 얻기 위해서는 다음과 같이 gcf()함수를 이용한다.


>> h=gcf() // 현재 선택되어 있는 그래프 창의 핸들을 얻는다.
>> h=gcf(n) // 아이디가 n인 그래프 창의 핸들을 얻는다.


아이디와 핸들은 구분해야 하는데 아이디는 여러 개의 그래프 창을 열었을 때 각각을 구분하기 위한 번호인 반면  핸들은 그래프 창의 각종 속성을 제어할 수 있는 내부 변수값으로서 자동으로 생성되어 부여된다. 여러 개의 그래프창들이 열려 있을 때 특정 아이디를 가지는 그래프창을 선택할 때도 이 함수를 사용하면 된다.


 현재 그래프 창에 그려진 내용을 지우려면 clf()를 이용하면 된다. 용례는 다음과 같다.


>> clf() // 현재 그래프의 모든 내용을 지운다.
>> clf(h) // 핸들이 h인 그래프창의 모든 내용을 지운다.
>> clf(n, ‘reset’) // 아이디가 n인 그래프 창의 모든 내용을 지우고 속성도 초기화시킨다.


두 번째 인수로 ‘clear’ 나 ‘reset’을 줄 수 있는데 ‘clear’는 단순히 내용만을 지우는 것이고 ‘reset’은 내용을 지운 후 변경된 속성까지 초기화시키는 것이다.


 그래프창을 닫으려면 close()나 xdel()함수를 이용하면 된다. 아이디로 닫으려면 xdel()함수를 이용하고 핸들로 닫으려면 close()함수를 이용하면 된다.


>> xdel() // 현재 선택된 그래프창을 닫는다.
>> xdel(n) // 아이디가 n인 그래프창을 닫는다.
>> close() // 현재 선택된 그래프창을 닫는다.
>> close(h) // 핸들이 h인 그래프창을 닫는다.



Posted by 살레시오
,

2차원 그래프

 Scilab에서 2차원 그래프를 그려주는 함수들 중 자주 사용되는 것들을 다음 도표에 정리하였다.


[표 1] Scilab의 2차원 그래프 함수

함수

기능

plot()

x-y 그래프를 그려준다.

polarplot ()

극좌표 그래프를 그려준다.

bar(), barh()

막대그래프

histplot()

히스토그램

pie()

파이차트


가장 많이 쓰이는 함수는 plot()함수이다.

plot() 함수

 plot()함수는 가장 기본적인 2차원 x-y 그래프를 만들어주는 함수로서 사용법이 MATLAB의 그것과 매우 유사하다. 첫 번째 예로 sin(x)의 그래프를 0과 2*%pi 범위에서 그려보도록 하겠다. 먼저 x벡터를 linspace()함수를 이용하여 다음과 같이 생성한다.


>> x = linspace(0, 2*%pi)


그 다음 y 데이터를 다음과 같이 생성한다.


>> y = sin(x)


그럼 다음 plot()함수를 이용하면 된다.


>> plot(x, y)


plot 함수의 내부적인 작동은 x-y 쌍의 점들을 직선으로 이어주는 것이다. 이 예에서는 100개의 (x,y) 좌표점을 서로 직선으로 연결하였으며 점들이 조밀하므로 마치 곡선처럼 보이는 것이다. 주의할 점은 x가 행벡터라면 y도 행벡터여야하고 x가 열벡터라면 y도 열벡터여야 한다는 점이다.


 다른 방법으로는 x좌표만 생성한 후 두 번째 인수로 함수명을 적어주는 것이다.


>> plot(x, sin )

 

그러면 자동으로 x벡터에 대해서 sin(x)를 구한 다음 그래프를 생성해 준다. (이 방법은 별로 권장되지 않는다.)


 만약 x는 행벡터이고 y가 행렬이라면 y행렬의 각각의 행에 대해서 그래프를 그려준다. 이 때 x의 열수와 y의 열수는 같아야 한다. 예를 들어서


>> Y = [sin(x); cos(x)]


명령은 Y 행렬을 만들어 주는데 첫 행은 sin(x)함수 값들이, 두 번째 행은 cos(x)함수 값들이 대입된다. 이제


>> plot(x, Y)


라고 하면 다음과 같이 x-Y(1,:) 과 x-Y(2, :) 에 대한 그래프를 하나의 창에 도시한다. 이 명령은 다음과 동일하다.


>> plot(x, sin(x), x, cos(x))

 

아래 결과를 보면 두 개의 그래프를 한 개의 그래프창에 도시하고 자동으로 색상이 다르게 지정되었음을 확인할 수 있다.



 함수 plot()의 세 번째 옵션으로 선의 색과 모양을 지정해 줄 수 있다. 아래 표에 자세한 옵션을 정리하였다. (MATLAB의 옵션과 매우 흡사하다.)


[표 2] plot()함수에서 선의 모양 지정자

기호

선 색

모양

기호

모양

마커

기호


r

red

-

직선(solid line)

+

Plus sign

g

green

--

파선(dashed line)

o

Circle

b

blue

:

점선(dotted line)

*

Asterisk

c

cyan

-.

일점쇄선 (dash-dotted line)

.

Point

m

magenta



x

Cross

y

yellow



's'

Square

k

black



'd'

Diamond

w

white



^

Upward-pointing triangle





v

Downward-pointing triangle





>

Right-pointing triangle





<

Left-pointing triangle





'p'

Five-pointed star (pentagram)






No marker (default)


이 세 가지 옵션을 조합하여서 다양한 선의 모양을 나타낼 수 있다.  예를 들어서 파란색 파선으로 그리고 싶다면 ‘b--’ 라고 세 번째 옵션으로 주면 된다.


>> plot(t, sin(t), ‘b--’)



실선을 유지하고 녹색원으로 마킹을 하려면 ‘g-o’라고 입력하면 된다.


>> plot(t, cos(t), ‘g-o’)



 그래프 축에 격자선(grid)을 추가하려면 xgrid(n)함수를 실행시키면 된다. n은 자연수로서 격자선의 색을 지정한다. 예를 들면 다음과 같다.


>> plot(t, cos(t), ‘r:’)
>> xgrid(2)

 


이 그림을 보면 xgrid(2) 명령에 의해서 파란색 격자선이 x축과 y축에 생겼음을 알 수 있다.


 그래프의 축의 범위를 지정하려면 mtlb_axis()라는 함수를 이용하면 된다.(Matlab의 axis라는 함수와 유사하게 만들어진 함수임) 예를 들어서 위 그래프에서 x축의 범위를 정확히 [0, 2pi] 범위로 맞추고 y축은 [-2, 2]로 넓히고 싶다면 다음과 같이하면 된다.


>> mtlb_axis([0 2*%pi -2 2])


또한 이 그림에 제목을 붙이려면 title() 함수를 이용한다.


>> title(‘sin and cos’)


그러면 그림의 상단에 그럼의 제목(title)이 생성된다. x축에 제목을 붙이는 함수는 xlable()이고 y축은 ylabel()함수를 사용한다.


>> xlabel(‘x-axis’)
>> ylabel(‘y-axis’)


타이틀과 x축, y축을 한꺼번에 지정하고 싶다면 xtitle()함수를 이용하면 된다.


>> xtitle(‘sin and cos’, ‘x-axis’, ‘y-axis’)


입력 인수는 차례대로 제목, x축 라벨, y축 라벨로 표시할 문자열이다. 만약 각각의 라벨을 사각형으로 둘러쌀려면 마지막 옵션으로 1을 주면 된다.


>> xtitle(‘sin and cos’, ‘x-axis’, ‘y-axis’, 1)

 

재미있는 것은 title(), xaxis(), yaxis, xtitle() 명령은 LaTeX 명령어를 사용할 수 있어서 미려한 수식을 출력할 수 있다. 예를 들면 다음과 같다.


>> title(‘$\frac{sin(x)}{x}$’)

 

 여러 개의 그래프를 하나의 그래프 창에 도시하려면 subplot(r,c,n)함수를 사용하면 되는데 현재 그래프 창을 r행 c열로 분할한 다음 그 중 n번을 선택한다. 예를 들면 다음과 같다


>> subplot(2,1,1) // ❶
>> plot(t,sin(t),'b:+')
>> subplot(2,1,2) // ❷
>> plot(t,cos(t),'k-.')


위의 ❶에서 subplot(2,1,1)이라고 입력했는데 이것은 현재 그래프 창을 2x1 으로 분할한 다음 그 중 1번째 자식창을 선택한다. 따라서 그 다음에 오는 plot()함수는 그 1번 자식창에 그려진다.  ❷에서는 subplot(2,1,2) 라고 했는데 2번째 자식창을 선택하는 것이다. 아래 결과를 보면 이 명령의 동작이 이해가 갈 것이다.



subplot(2,1,1) 은 subplot(211)이라고 숫자들 길 그냥 붙여서 쓸 수도 있다. 예를 들어서 subplot(221)이라면 2x2로 나누고 그 중 첫 번째 자식창을 선택하라는 것이다. 이와 같이 subplot()함수를 이용하면 하나의 그래프 창에 여러개의 그래프를 분할하여 도시할 수 있다.



Posted by 살레시오
,

 MATLAB에서 여러 개의 그래프를 분할하여 하나의 그래프 창에서 모아 그리고자 하는 경우 subplot 명령을 이용한다. subplot 명령을 사용하면 그래프 창을 분할하여 다수의 그래프를 하나의 그래프 창에 도시할 수 있다. 이 명령어의 입력 인자는 그래프 창을 분할하는 행의 개수, 열의 개수 그리고 몇 번째 그래프인지를 지정하는 수의 세 개이다.


 예를 들어 subplot(2,2,3)한 후 plot(x,y)를 하면 하나의 그래프 창을 가로로 이분할, 세로로 이분할하여 3 번째의 위치에 x, y 벡터로 구성된 그래프를 도시한다는 명령이 된다. 그래프의 순서를 세는 것은 맨 첫 번째 행부터 가로로 세어 나가는 것을 원칙으로 한다.


>> x=linspace(0,2*pi,100);
>> subplot(2,2,3)
>> plot(x,sin(x))
>> subplot(2,2,2)
>> plot(x,cos(x))


[그림 1] 실행 결과 (gnu octave 실행 화면을 캡쳐한 것임)


우선 화면이 가로 세로 각 2 개씩 4 분할되는 것을 확인할 수 있으며 두 번째와 세 번째 위치에 그래프를 그리게 된다. 왼쪽 하단의 그래프가 먼저 그려지고 오른쪽 상단의 그래프가 나중에 그려지게 된다.


[그림 2] 2x2 로 분할한 경우 각 부분의 번호


각 분할 그래프의 선 모양, 색깔 바꾸기 등은 전에 설명한 바와 같이 그래프 정보 대화상자에서 할 수 있으며 명령어창에서도 가능하다. 명령어창에서 하려면 우선 subplot 함수를 이용하여 바꾸고자 하는 분할 그래프를 선택한 후 plot이나 title 등 원하는 함수를 이용하여 수정하고 나타낸다.


 다른 예를 들면 다음과 같다.


>> x=linspace(0,2*pi,100);
>> subplot(211), plot(x,sin(x))
>> subplot(212), plot(x,cos(x))


이 경우는 화면은 2분할하여 첫 번째 부분 화면에는 sin(x)를 그리는 것이고 두 번째 부분화면에는 cos(x)를 그리는 예제이다.

[그림 3] 실행 결과 (gnu octave 실행 화면을 캡쳐한 것임)


[그림 4] 2x1 로 분할하였을 경우의 그래프 번호


이 예에서와 같이 subplot()함수의 세 개의 인수는 각각 콤마(,) 로 구분하여 줄수도 있고 뿥여서 하나의 숫자로 넘겨줄 수 도 있다.



Posted by 살레시오
,

 이전 포스트들에서 설명한 plot(a,b) 명령어에서는 a벡터를 x축에, b벡터를 y축에 선형 스케일로 2차원 그래프를 그린다. 수학이나 공학에서는 넓은 영역의 값을 한 그래프에 나타내기 위해 때때로 로그 단위의 그래프를 그릴 필요가 있다. 특히 주파수를 기본 축으로 하는 함수에서는 그 값이 일반적으로 log 단위로 표시되는데 이때 사용되는 명령어로는 아래와 같이 semilogx(), semilogy(), loglog() 등이 있다. 그리고 극좌표 스케일의 그래프를 그릴 때는 polar() 함수를 사용한다.

[표 1] 로그 스케일 그래프를 생성하는 함수

loglog(a,b)

x축과 y축 모두 로그 스케일인 그래프 생성

semilogx(a,b)

x축만 로그 스케일인 그래프 생성

semilogy(a,b)

y축만 로그 스케일인 그래프 생성

polar(a,b)

극좌표 그래프를 그린다

 예를 들어 다음의 식을 고려해보자.

먼저 x축의 값인 주파수를 로그단위로 나타내 보자. 함수 logspace()를 사용하면 일정한 상용 로그값 차이를 갖는 벡터를 만들어 준다.


>> w = logspace(-1,2,100)
>> H = 1 ./(1+w.^2).^0.5
>> semilogx(w,H)
>> grid on


벡터 w에는 10-1(rad/sec)에서 102 (rad/sec)까지의 값을 100등분하여 로그값을 저장한다. 즉, logspace() 함수는 다음과 완전히 동일하다.


>> w = 10.^linspace(-1,2,100)


x축을 log 스케일로 그리는 그래프는 semilogx() 함수를 이용하면 된다.

[그림 1] 실행 결과 (gnu octave 실행 결과를 캡쳐)


 polar()함수는 극좌표계의 그래프를 그려준다. 입력 인수로 거리와 각도를 각각 받는다. 즉 polar(r, a) 에서 r은 거리의 벡터, a는 각도(단위는 라디안)의 벡터로 주어져야 한다.


>> polar(0:10, 0:10)


[그림 2] 실행 결과 (gnu octave 실행 결과를 캡쳐)


polar()함수가 그림을 그리는 원리는 plot()함수와 동일하다. (거리, 각도) 쌍의 점을 찍은 후 그것들을 선으로 이어주는 것이다. 선의 색/모양을 지정하는 방법은 polt()함수와 동일하다.


>> t=linspace(0,pi,100)
>> polar(sin(t), cos(t))


[그림 2] 실행 결과 (gnu octave 실행 결과를 캡쳐)


이렇게 MATLAB에서 로그스케일 그래프와 극좌표 그래프를 쉽게 생서할 수 있다.



Posted by 살레시오
,

 여기에서는 이전 포스트들 (part 1, part 2, part 3)에 이어서 plot()함수에 대해서 더 알아보도록 하겠다.  plot()함수에서 그림의 제목과 x축 라벨 그리고 y축 라벨을 써주는 함수는 각각 title(), xlabel(), ylabel()함수이며 이들은 문자열을 입력 파라메터로 받아들여서 그래프에 도시하는 함수이다. 예로서 함수 sin(x)/x 그래프를 그려보자.


>> x=0:0.1:10
>> y=sin(x)./x
>> plot(x,y)


여기서 두 번째 줄에서 y값을 계산하는데 (./)연산자를 사용했음에 주의해야 한다. sin(x)도 벡터이고 x도 벡터이므로 각각의 요소간 나눗셈을 수행해야 하므로 (./)연산자를 사용한다. 이제 이렇게 생성된 그래프에 제목과 x축 라벨 그리고 y축 라벨을 추가해 보자.


>> title('graph of sin(x)/x')
>> xlabel('x')
>> ylabel('y')


결과 그림을 확인해 보면 그래프 상단에 타이틀이 하단에 x축 라벨이 그리고 오른편에 y축 라벨이 표기되어 있음을 확인할 수 있다.

[그림 1] 실행 결과 (gnu octave 를 캡처)


각 축의 화면에 보여지는 범위를 조절하는 함수로서 axis()함수가 있으며 이 함수의 문법은 다음과 같다.


>> axis([XMIN XMAX YMIN YMAX])


여기서 XMIN와 XMAX는 각각 x축의 최소값과 최대값을 그리고 YMIN와 YMAX는 각각 y축의 최소값과 최대값을 표기한다. 예를 들면 다음과 같다.


>> axis([2 8 -0.2 0.6])


이렇게 하면 그래프의 x축 범위가 2에서 8로 그리고 y축 범위가 -0.2에서 0.6으로 조정된다. 또한 axis()함수가 입력파라메터 없이 사용되면 현재 그래프의 xy축의 범위를 반환한다.


>> axis
2.0000 8.0000 -0.2000 0.6000

 MATLAB이 자동으로 축의 범위를 설정하게 하려면 axis auto 명령을 사용한다.


 이제 하나의 그림창에 여러 함수의 그래프를 도시하는 다른 방법을 살펴보자. 먼저 다음과 같은 두함수를 x∈[0,10]의 구간에 대해서 도시하고자 한다.

도시할 데이터를 다음과 같이 생성한다.


>> x = linspace(0,10,50)
>> y1= -0.5*x.^2+1;
>> y2= 2*sqrt(x)-10;


그리고 다음과 같이 그래프를 생성한다.


>> plot(x,y1,'k')
>> hold on
>> plot(x,y2,'k--')
>> grid on
>> legend('-0,5*x^2+1','2*sqrt(x)-10')


여기서 ‘hold on’ 이라는 명령어가 사용되었다. 이 명령어는 지금 활성화된 그래프 창의 내용을 그대로 유지하라는 명령어이다. 그렇기 때문에 두 번째 plot()함수에 의해서 처음에 그려진 그림이 지워지지 않고 그 위에 덧그려진다. 만약 hold on 명령어가 없었다면 첫 번째 그림은 지워지고 두 번째 그림만 남았을 것이다. hold off명령어를 내리지 않는 이상 이후에 호출되는 plot()함수에 의한 결과는 계속 그 위에 덧그려진다. 그리고 grid on 이라는 명령어는 그림에 격자 표시를 하라는 명령어이다. 격자를 지우고 싶으면 grid off라고 하면 된다. 마지막으로 legend()함수는 문자열들을 입력으로 받아서 그래프들에 대한 설명을 생성하는 명령어이다.

[그림 2] 실행 결과 (gnu octave 를 캡처)

 현재 그래프 창의 내용을 지우는 명령은 clf이고 새로운 그래프 창을 생성하는 함수는 figure()함수이다. 위의 예로 다시 설명하면 두 함수를 각각 다른 창에 도시하고 싶을 때는 다음과 같이 하면 된다.


>> plot(x,y1)
>> figure(2), plot(x,y2,'k')


첫 번째 plot()함수로 첫 번째 그림창이 생성되므로 이 그래프 창이 1번의 번호를 가지게 된다. figure(2)라는 명령어로 두 번째 새로운 그래프 창이 생성이 되며 이후의 plot()함수에 의한 그림은 두 번째 창에 그려지게 된다. (캡션바에 그래프 창 번호가 표시됨)


[그림 3] 실행 결과 (gnu octave 를 캡처)

 현재 열려있는 특정한 그림창을 없애는 명령어는 close(n)명령어이다. 이 명령어로 n번 그래프 창이 소멸된다. 현재 생성되어 있는 모든 그림창들을 닫고 싶으면 close all 명령을 내리면 된다.



Posted by 살레시오
,

 이전 포스트들(part 1, part 2)에 이어서 plot()함수데 대해서 더 알아보도록 하겠다. plot()함수의  자세한 온라인 설명은 help plot 명령으로 볼 수 있으며 다음 표에 옵션을 정리하였다.


[표 1] plot() 함수의 그래프 모양을 정하는 옵션

심벌

색상

심벌

표시자

심벌

선의종류

y

노란색

.

.

-

실선

m

진홍색

o

:

점선

c

청록색

x

x

-.

실선과 점선

g

녹색

+

+

--

실선과실선

b

청색

*

*

k

검은색

^

r

빨간색

v

w

흰색

<

>

s(quare)

d(iamond)

p(entagram)

h(exagram)


위의 표에 소개된 옵션은 다음과 같이 지정할 수 있다.


>> plot(x,y,'option')


만약 option을 지정하지 않으면 기본 설정으로 ‘파란색 실선’의 그래프가 그려지게 되며 위의 option자리에 [표 1]에 소개된 색과 표시자 그리고 선의 종류를 지정하면 된다. 다음의 예를 보자.


>> a=1:0.1:10;
>> b=cos(a);
>> c=sin(a);
>> plot(a,b,'*',a,c,'k')


이 예는 코사인함수는 별표로 그리고 사인함수는 검은색 실선으로 그리는 예제이다. 여기에서 심벌로 지정한 경우는 점의 위치에 그 기호를 표시한다. (선의 경우는 점과 점사이를 잇는다.)

[그림 1] 실행 결과 (gnu octave에서 캡처)

지정자는 색과 표시자 그리고 선의 종류를 동시에 지정할 수도 있다.


>> plot(a,b,'b:',a,c,'m+') 󰎠


이 예에서 ‘b:'지정자는 ‘파란색 점선’으로 그리라는 것이고 ’m+'는 ‘진홍색 십자’로 그리라는 지정이다.


[그림 2] 실행 결과 (gnu octave에서 캡처)

 다음에 몇가지 예제를 더 들었다. 각각을 직접 실행시켜서 짐작대로 그림이 그려지는지 확인해 보자.


plot(x,y,'-.c')

plot(x,y,':r')

plot(x,y,'-sg')

plot(x,y1,'-r',x,y2,'--c')

plot(x,y1,'b',x,y2,'oy')

plot(x,sin(x),'-kp')


위에서 마지막 예를 이용해 보면 다음과 같다.


>> x=linspace(0,2*pi,30);
>> plot(x,sin(x),'-kp')


[그림 3] 실행 결과 (gnu octave에서 캡처)


여기에서 ‘실선’과 ‘펜타그렘’이 동시에 지정되어 있으므로 점의 위치에는 펜타그램이 그려지고 그것들을 실선으로 잇게 되는 것이다. (‘k’지정자에 의해서 색은 검은색)




Posted by 살레시오
,

 여기에서는 이전 포스트에 이어서 계속 plot()함수에 대해서 설명하도록 하겠다. 만약 sin(x)cos(x)함수를 그리고자 한다면 다음과 같이 하면 될 것이다.


>> x = 0:0.1:2*pi;
>> y = sin(x).*cos(x);
>> plot(x,y)


두 번째 줄에서 sin(x)와 cos(x)두 벡터의 곱에 (.*)연산자를 사용했음에 주의해야 한다. 계산하고자 하는 것이 두 벡터의 요소들 사이의 곱이기 때문이다.


[그림 1] 실행 결과 (gnu octave 에서 캡쳐)


또 다른 예로 x2+xsinx+1 이라는 함수를 도시하고자 한다면 다음과 같이 입력하면 된다.


>> x = -10:0.1:10;
>> y = x.^2 + x .*sin(x) + 1;
>> plot(x,y)


여기에서도 두 번째 줄에 (.^)연산자와 (.*)연산자가 쓰였음을 주의해서 보기 바란다. 요소간 연산을 수행해야 하기 때문이다.


[그림 2] 실행 결과 (gnu octave 에서 캡쳐)


두 번째 입력 파라메터가 행렬인 경우는 각각의 행을 서로 다른 그래프로 보여주게 된다. 다음 예를 보자.


>> x=linspace(0,2*pi,30);
>> y1=sin(x);
>> y2=cos(x);
>> Y=[y1;y2];
>> plot(x,Y)


의 예에서 linspace()함수는 0부터 까지 30개의 등간격 점을 생성하여 반환해주는 함수이다. plot()함수의 두 번째 파라메터 Y는 행렬이다. 아래  결과를 보면 각각의 행에 해당하는 그래프가 따로 도시됨을 알 수 있다.


[그림 3] 실행 결과 (gnu octave 에서 캡쳐)

 

또는 다음과 같이 따로따로 입력해도 같은 결과를 얻을 수 있다.


>> plot(x,y1,x,y2)


다음과 같이 x와 y값을 바꾸어서 입력하면 90도 회전시킨 그림을 도시하게 된다.


>> plot(Y,x)

[그림 4] 실행 결과 (gnu octave 에서 캡쳐)


이제까지 예제에서 그래프의 모양은 기본형이 실선으로 되어 있기 때문에 실선으로 그려졌으나 사용자가 임의로 지정할 수도 있다. 즉 선의 색상, 선의 모양 그리고 선의 종류를 사용자가 직접 지정할 수도 있다. 이것에 대해서는 다음 포스트에서 자세히 알아보도록 하겠다.



'프로그래밍언어.Lib > MATLAB' 카테고리의 다른 글

MATLAB의 plot()함수 (part 4)  (0) 2015.06.30
MATLAB의 plot()함수 (part 3)  (0) 2015.06.30
MATLAB의 plot()함수 (part 1)  (0) 2015.06.30
MATLAB의 ezplot()함수  (1) 2015.06.27
MATLAB의 기본적인 수학 함수들  (0) 2015.06.27
Posted by 살레시오
,

 여기에서는 2차원 그래프를 작성하는데 많이 쓰이는 plot()함수의 사용법에 대해서 자세히 알아보도록 하겠다.(이후 예제는 gnu octave로 모두 실행 가능함) 먼저 다음 예제를 실행해 보자.


>> y=(-3:3).^3; 󰎠
>> plot(y); 󰎠

[그림 1] 실행 결과 (gnu octave 에서 캡쳐)

plot()함수는 입력 파라메터(일단은 벡터라고 가정한다)가 하나일 때는 x축에는 인덱스 값을, y축에는 그 입력 파라메터를 도시한다. 즉 위 예제의 경우

y = [ -27 -8 -1 0 1 8 27]
인덱스  1  2  3  4 5 6 7

이므로 이를 (x,y)쌍으로 나타내면 (1,-27), (2,-8), (3,-1), (4,0), (5,1), (6,8), (7,27) 이고 plot()함수는 이 위치에 점을 찍은 후 이들을 선으로 연결한다. [그림 1]을 자세히 관찰해 보면 이해가 갈 것이다. 만약 점들의 간격이 충분히 좁다면 마치 곡선처럼 보일 것이다.


>> y=(-3:0.1:3).^3;
>> plot(y) 󰎠


[그림 2] 실행 결과 (gnu octave 에서 캡쳐)


점과 점의 간격이 작기 때문에 마치 곡선처럼 보이지만 기본적인 원리는 앞에서 설명한 바와 같다.

 또 다른 예로서 한 주기 동안 시간 t와 시간함수인 사인 함수 y=sin(t)를 그래프로 그려보자. 먼저 기준 축인 시간함수의 벡터를 정해야 한다.


>> t = 0:0.1:2*pi ; %t축 데이터 생성
>> y = sin(t); %y축 데이터 생성
>> plot(t,y)

[그림 3] 실행 결과 (gnu octave 에서 캡쳐)


입력 파라메터가 두개인 경우 두 입력은 크기가 같은 벡터여야 하며 첫 번째 파라메터를 x축에 그리고 두 번째 파라메터를 y축에 대응시켜서 그래프를 그리게 된다.


>> x=-2:5;
>> y=exp(x);
>> plot(x,y)


위의 예에서 다음과 같은 행벡터들을 얻을 수 있다.

x=[ -2 -1 0 1 2 3 4 5]

y=[ 0.14 0.36 1 2.72 7.39 20.09 54.60 148.41]

따라서 plot()함수는 (x,y)순서쌍 (-2,0.14),  (-1,0.36), (0,1), (1,2.72), (2,7.39), (3,20.09), (4,54.60), (5,148.41)의 위치에 점을 찍은 후 이들을 서로 실선으로 연결하게 된다. [그림 4]에 결과가 도시되어 있다.


[그림 4] 실행 결과 (gnu octave 에서 캡쳐)

좀 더 부드러운 곡선을 얻기 위해서는 행벡터 x의 간격만 줄여주면 된다.


>> x=-2:0.01:5;
>> y=exp(x);
>> plot(x,y)

[그림 5] 실행 결과 (gnu octave 에서 캡쳐)



Posted by 살레시오
,

 여기에서는 MATLAB에서 그래픽을 그려주는 함수들중 ezplot() 함수에 대해서 설명하겠다. MATLAB에서 자주 사용되는  그래픽 함수는 다음과 같다. (아래 함수들은 gnu octave 4.x 이상 버전에서 모두 지원한다.)


[표 1] 그래프 함수들

함수명

비고

ezplot(), fplot()

plot()

ezpolar(), polar()

loglog(), semilogx(), semilogy()

2차원 그래프

ezplot3(), ezmesh(), ezsurf()

plot3(), mesh(), surf()

3차원 그래프


 이것들 중 ezplot()함수는 사용자가 쉽게 (easy) 수학 함수의 그래프를 그릴 수 있도록 해주는 함수이고 fplot()함수는 함수(function)의 그래프를 그려주는 함수이다. 두 함수 모두 어떤 함수의 2차원 그래프를 그려주는 함수로서 명시적 함수( y=f(x) 의 형식) 과 암시적 함수 ( f(x,y)=0 의 형식)을 도시하는데 있어서 plot()함수보다는 보다 편하게 사용할 수 있다.

 가장 간단한 사용법은 도시하고자 하는 함수를 문자열로 입력하면 된다. 예를 들어 y=cos(x) 함수를 그리고 싶다면


>> ezplot('cos(x)')


[그림 1] gnu octave 4.x에서의 실행 결과


명시적 함수 y=f(x) 에서 f(x) 부분만 문자열로 입력하면 된다. y=sqrt(1-x2) 을 그리고 싶다면 다음과 같이 입력한다.


>> ezplot('sqrt(1-x^2)')

[그림 2] gnu octave 4.x 에서의 실행 결과


 만약 x축의 범위를 명시하고 싶다면 두 번째 파라메터로 x축의 최소값, 최대값을 가지는 행벡터를 입력하면 된다.


>> ezplot('sin(x)*cos(x)', [0 pi])

[그림 3] gnu octave 4.x 에서의 실행 결과


위의 명령은  sin(x)cos(x) 그래프를 그리되 x축의 범위를 0과 π사이로 하라는 것이다.


 암시적 함수도 그대로 문자열로 입력하면 된다. 예를 들어서 원의 방정식 x2+y2=16 을 그리고 싶다면 우변을 0으로 만든 다음 x2+y2-16=0 그 좌변을 입력하면 된다.


>> ezplot('x^2+y^2-16')


[그림 4] gnu octave 4.x 에서의 실행 결과


 이 경우도 두 번째 파라메터로 x축의 범위를 입력할 수 있다. 예를 들어 x3+y3-5xy+0.2=0 의 그래프를 그리되 x축의 범위를 [-3 3]로 하고 싶다면 다음과 같이 하면 된다.


>> ezplot('x^3 + y^3 - 5*x*y + 0.2',[-3,3])

[그림 5] gnu octave 4.x 에서의 실행 결과


 ezplot()함수는 x와 y의 관계식이 직접적으로 나타내지지 않고 매개변수에 의해서 관계 지어지는 경우도 도시할 수 있다. 예를 들어서 매개변수 t 에 대해서 x=sin(t) , y=cos(t)의 관계식이 주어진 경우 이들을 순서대로 입력하면 된다.


>> ezplot('sin(t)','cos(t)')

[그림 6] gnu octave 4.x 에서의 실행 결과


또한 다음과 같은 관계식을 가지는 x-y그래프를 t가 [0 π]의 범위를 가질 경우에 대해서 도시하려면

다음과 같이 하면 된다.


>> ezplot('sin(3*t)*cos(t)', 'sin(3*t)*sin(t)', [0,pi])

[그림 7] gnu octave 4.x 에서의 실행 결과


즉, 매개변수를 가지는 xy그래프를 그릴 때 세 번째 입력벡터는 매개변수의 범위가 된다.



Posted by 살레시오
,