이전 포스트들(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 살레시오
,


 윈도에서 gcc/g++ 을 사용할 수 있도록 하는 툴이 minGW 이다. IDE(eclipse, netbeans, codelite 등등 어느 것이나)를 설치한 후 MinGW를 깔고 적절히 설정해야 프로그램을 개발할 수 있다. (MinGW나 cygwin 이나 설치 과정과 설정이 상당히 번거롭다는 점은 감안하자. 제대로만 하면 엄청난 툴을 무료로 사용할 수 있다.)


설치 과정

먼저  http://www.mingw.org 로 접속하여 인스톨 프로그램을 다운로드 받는다.



오른쪽 [Download Installer]를 클릭하면 인스톨러를 다운로드 받을 수 있다.



실행하면 아래와 같은 화면이 나타난다.



설치 디렉토리를 설정하고 설치를 진행한다. (보통은 폴더를 바꾸지 않는다.)


설치가 완료 되면 아래와 같은 MinGW Installation Manager가 실행된다.



이때 Basic Setup Tree에서 mingw-developer-toolkit, mingw32-base, mingw32-gcc-g++, msys-base를 선택한다. 각 항목에서 클릭한 후 ‘Mark’메뉴를 선택한다.



메뉴 “Installation > Apply Changes”를 통해 시스템에 적용한다.





[Apply] 를 눌러 설치를 진행한다. (이 단계에서 시간이 좀 걸린다.)




기본 설치가 완료되면 [Close]를 눌러 Applying scheduled changes 창을 닫는다. MinGW 인스톨러도 종료한다.


환경 설정

 설치만 했다고 끝나는 것은 아니고 Windows의 환경변수에 MinGW에 대한 경로를 설정해야 한다.


먼저 시작버튼>내 컴퓨터(마우스 오른쪽 버튼)>속성 메뉴를 선택한다.


좌상단 맨 밑의 “고급 시스템 설정”을  선택한다.


“고급 탭” 선택 후 하단의 [환경변수(N)] 버튼을 클릭한다.


아래 “시스템 변수(S)” 항목 중 “Path” 항목을 찾아 선택하고 [편집…] 버튼을 선택한다.




“변수 값(V)” 항목에서 이전에 있던 값은 그대로 두고 가장 오른쪽에 커서를 위치한 뒤

“;C:\MinGW\bin;C:\MinGW\msys\1.0\bin” 를 추가한다. 앞의 경로는 gcc/g++/gdb/make 를 실행가능하게 해주고 뒤에 것은 리눅스 명령을 윈도환경에서 사용 가능하게 해주는 것이다. 맨 앞의 세미콜론(;)을 빠뜨리지 말자.


[확인]버튼을 누른다.


테스트



“시작버튼/실행창&검색창”을 통해 “cmd"를 실행하여 도스창을 연다. 그리고 ls 명령을 입력하여 실행되어야 정상이다.



이제 gcc와 g++의 버전을 확인해 보자.



이렇게 나왔다면 MinGW설치가 완료된 것이다.



Posted by 살레시오
,

 C++ 에서 동적으로 메모리를 생성하고 반환하는 명령은 new와 delete인데 이것을이용하면 객체의 배열도 동적으로 생성하고 반환할 수 있다. new를 이용하여 Rect 라는 클래스 객체의 배열을 동적으로 생성하는 구문은 다음과 같다.


Rect *pRect = new Rect[3];


이렇게 하면 연속된 세 개의 Rect 객체가 생성되는데 이 때 각 객체에 대해 기본 생성자 Rect() 가 호출된다. 이렇게 생성된 객체 배열은 보통의 배열처럼 사용된다.


pRect[0].setWidth(11);

(pRect+1)->setWidth(21); //포인터의 멤버 함수 호출 시 -> 사용

pRect[2].setWidth(33);


이렇게 할당 받은 배열의 메모리를 반환하는 형식은 다음과 같다.


delete [] pRect;


delete 명령과 pRect 포인터 이름 사이의 [] 를 빠뜨리면 안 된다. 이렇게 하면 세 개의 Rect 객체가 소멸되는데 이 때 각 객체의 소멸자가 호출된다.


 한 가지 주의할 점은 new를 이용하여 동적으로 객체 배열을 생성할 때, 매개 변수가 있는 생성자를 호출할 수 없다는 점이다. 만약 어떤 객체를 배열로 생성하여 사용할 경우 이 점을 염두에 두고 생성자와 멤버 함수를 설계해야 한다.


class Rect {
public :
   ….
   Rect();
   Rect(double width, double height); //(2)
   ….
};


위의 예에서 두 번째 생성자 (2)는 배열을 생성하면서 동시에 호출할 수 없다. 따라서 다음과 같이 분리해 놓고


class Rect {
public :
   ….
   Rect();
   void set(double width, double height);
   ….
};


객체 배열 생성 후 반복문으로 순차적으로 set()함수를 호출하는 방법을 사용해야 한다.


Rect *pRect = new Rect[100];
for (int k=0; k<100; k++)
   pRect[k].set(11,22);




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 살레시오
,

 여기에서는 MATLAB에 내장된 수학 함수들을 소개한다.


  MATLAB의 모든 삼각함수는 입력과 출력의 단위로 라디안(radian)을 사용한다. 라디안을 도(degree)로 혹은 도를 라디안으로 변환하려면 다음과 같이 하면 된다.


>> angle_deg = angle_rad*(180/pi)
>> angle_rad = angle_deg*(pi/180)


[표 1] 삼각함수 관련 함수들

함수

기능

sin(x)

x의 sine값 계산

cos(x)

x의 cosine값 계산

tan(x)

x의 tangent값 계산

asin(x)

x의 arcsine값 계산. 단 x는 -1과 1사이의 값이어야 하고 결과값은 라디안으로 -π/2 와 π/2 사이의 값이다.

acos(x)

x의 arccosine값 계산. 단 x는 -1과 1사이의 값이어야 하고 결과값은 라디안으로 -π/2 와 π/2 사이의 값이다.

atan(x)

x의 arctangent값 계산. 결과값은 라디안으로 -π/2 와 π/2 사이의 값이다.

atan2(y,x)

y/x 의 arctangent값 계산. 결과값은 라디안으로 -π/2 와 π/2 사이의 값이다.


[표 2] 쌍곡선 함수들

함수

기능

sinh(x)

hyperbolic sin 함수

cosh(x)

hyperbolic cos 함수

tanh(x)

hyperbolic tan 함수

asinh(x)

각각의 역함수들

acosh(x)

atanh(x)


[표 3] 공통 함수

함수

기능

abs(x)

절대값(=|x|)

sqrt(x)

sqrtm(A)

제곱근( square root) 요소간 연산

제곱근. 행렬 연산

round(x)

반올림

fix(x)

x를 0의 방향의 가장 가까운 정수로

floor(x)

x를 -inf 의 방향의 가장 가까운 정수로

ceil(x)

x를 +inf 의 방향의 가장 가까운 정수로

sign(x)

x<0이면 -1, x=0이면 0, x>0이면 1을 반환

rem(x,y)

x를 y로 나눈 나머지

exp(x)

expm(A)

지수 함수, 요소간 연산

지수 함수, 행렬 연산

log(x)

logm(A)

밑이 e인 로그(자연 로그) 요소 간 연산

밑이 e인 로그(자연 로그) 행렬 연산

log10(x)

밑이 10인 로그

MATLAB에서 밑이 e인 로그함수는 log()이다. (ln()이 아님에 유의할 것) 밑이 10일 로그 함수는 log10 이다. 보통 수학책에서는 log 가 밑이 10인 로그 함수를 표기하는데 MATLAB에서는 밑이 e인 함수명이라는 것에 유의해야 한다.


[표 4] 복소수 관련 함수

함수

기능

abs(s)

복소수 s의 크기를 계산 (=|s|)

real(s)

복소수 s의 실수부 계산

imag(s)

복소수 s의 허수부 계산

conj(s)

켤레복소수

angle(s)

복소수의 각도(radian)를 계산


여기에서 소개한 함수들은 MATLAB의 기본적인 내장 함수이므로 별다른 조치 없이 바로 사용할 수 있다.



Posted by 살레시오
,

 여기서는 이전 포스트에 이어서 다항식 관련 함수들에 대해서 알아보겠다. 두 다항식의 곱셈은 conv()함수에 의해서 구해진다. 두 함수 a(x)=x3+2x2+3x+4 와 b(x)=x3+4x2+9x+16의 곱을 구해보자.


>> a=[1 2 3 4], b=[1 4 9 16]
a =
  1   2   3   4
b =
   1    4    9   16

>> c=conv(a,b)
c =
   1    6   20   50   75   84   64


이 결과로부터

c(x) = x6+6x5+20x4+50x3+75x2+84x+64

임을 알 수 있다.


 방정식간의 나눗셈은 deconv()함수를 이용한다. 앞에서 구한 방정식 c(x)와 b(x)를 이용하여 를 구하면 다음과 같다.


>> deconv(c,b) 󰎠
1.0000 2.0000 3.0000 4.0000


결과가 a(x)와 같음을 알 수 있다.


다항식의 미분을 계산하는 함수로 polyder()함수가 있다. 예를 들어 p(x)=x3-2x-5 의 미분함수를 계산하려고 한다면


>> p=[1 0 -2 -5]
p =
1 0 -2 -5
>> q=polyder(p)
q =
3.0000 0 -2.0000


여기서 p’(x)=3x2-2임을 알 수 있다. 만약 함수 polyder()로의 입력벡터가 두 개면 두 다항식의 곱의 미분을 구해준다.


>> a=[1 3 5], b=[2 4 6]
a =
1 3 5
b =
2 4 6

>> polyder(a,b)
8.0000 30.0000 56.0000 38.0000


여에서 a(x)=x2+3x+5와 b(x)=2x2+4x+6의 곱함수 a(x)b(x)을 미분한 결과는 8x3+30x2+56x+38 이라는 것을 알 수 있다. 마지막으로 입력도 두개이고 출력도 두개라면, 예를 들어서


>> [q,d]=polyder(a,b) 󰎠
q =
-2 -8 -2
d =
4 16 40 48 36


와 같이 사용한다면 a(x)/b(x)를 미분한 결과를 q(x)/d(x)로 반환해 준다. 즉 다음과 같은 다항식

을 미분한 결과는 다음과 같다는 것을 알 수 있다.


 이제 역라플라스 변환이나 역z변환에서 자주 쓰이는 부분분수전개 (partial fraction expansion) 에 대해서 살펴보자. 부분분수 전개를 수행하는 함수는 residue()함수이다. 어떤 다항식 a(x)와 b(x)에 대해서 a(x)가 다중근을 갖지 않는다면 분수식은 다음과 같이 전개될 수 있다.

예를 들어서

를 부분분수전개한 결과를 보려면 다음과 같이 하면 된다.


>> a=[1 6 8], b=[-4 8]
a =
1 6 8
b =
-4 8

>> [r1,p1,k1]=residue(b,a)
r1 =
-12
8
p1 =
-4
-2
k1 =
Empty matrix: 0-by-0


이것으로 부터 다음을 알 수 있다.

다음과 같이 다중근을 가지는 경우를 살펴보자.

이 식을 부분분수전개를 하려면 예를 들어 다음과 같이 하면 된다.


>> [r2, p2, k2] = residue( 1, poly([1 0.5 0.5]) )
r2 =
4.0000
-4.0000
-2.0000
p2 =
1.0000
0.5000
0.5000
k2 =
Empty matrix: 0-by-0


이 예에서 분모항 을 입력하기 위해서 poly()함수를 사용다. 반환된 벡터 r2,p2 그리고 k2로부터 다음과 같은 결과로 해독한다.

여기서 p2벡터의 세 번째 요소인 두 번째 0.5 는 이중근임을 나타냄에 유의해야 한다.


 지금까지 소개한 다항식에 관련된 함수들을 표로 정리하면 다음과 같다.


[표 1] 다항식에 관련된 함수들 정리

함수

기능

roots()

방정식의 해를 구한다

poly()

해로부터 방정식을 구한다

polyval()

특정한 스칼라값에서의 방정식의 값을 구한다

polyvalm()

특정한 행렬을 대입한 방정식의 값을 구한다

residue()

부분분수전개를 한다.

polyder()

방정식의 미분을 구한다.

conv()

방정식의 곱을 구한다.

deconv()

방정식의 나눗셈을 수행한다.



Posted by 살레시오
,

 MATLAB은 다항식을 다루는 몇 개의 함수를 제공한다. 예를 들어 방정식의 근을 구한다던가, 어떤 다항식의 미분 혹은 적분을 구하는 함수등이 제공된다.

 예를 들어서 x4-12x3+25x+116 이라는 다항식은 다음과 같이 계수들을 순서대로 가지는 p라는 변수에 저장한다.


>> p=[1 -12 0 25 116]
p =
    1   -12     0    25   116


여기서 계수들을 입력할 때 다항식이 사실 x4-12x3+0x2+25x+116 이므로  x2항의 계수인 0도 반드시 써야 한다는 것에 주의하자. 이제 이 방정식의 근은 roots()함수를 이용하여 구할 수 있다.


>> r=roots(p)
r =
11.747282870823
2.702820743841
-1.22505180733187 + 1.46720800872890i
-1.22505180733187 - 1.46720800872890i


위에서 보듯이 roots()함수는 해들은 열벡터에 저장하여 반환한다. 반대로 해로부터 방정식을 구할 수도 있다. 예를 들어 어떤 방정식의 해가 1,2,3,4,5 일 때 이들을 해로 가지는 방정식은 (x-1)(x-2)(x-3)(x-4)(x-5) 일 것이다. 이 방정식의 계수를 구하는 함수가 poly()함수이다.


>> poly([1 2 3 4 5])
ans =
    1   -15    85  -225   274  -120


위에서 1, 2, 3, 4, 5를 해로 가지는 방정식은 x5-15x4+85x3-225x2+274x-120 이라는 것을 알 수 있다. 처음 나왔던 예제에서 roots()함수를 이용하여 방정식의 근을 r에 저장하였다. 이것을 이용하여 원래의 방정식을 구할 수 있다.


>> pp=poly(r)
pp =
1.0000 -12.0000 -0.0000 25.0000 116.0000


입력변수가 nxn 크기의 행렬인 경우 poly()함수는 이 행렬의 특성방정식(characteristic equation)의 계수를 반환한다.


>> A=[1.2 3 -0.9; 5 1.75 6; 9 0 1] 󰎠
A =
1.2000 3.0000 -0.9000
5.0000 1.7500 6.0000
9.0000 0 1.0000
>> poly(A) 󰎠
1.0000 -3.9500 -1.8500 -163.2750


행렬의 특성방정식이란 det(xI-A) 를 말하며 위의 경우 이 특성방정식이 x3-3.95x2-1.85x-163.275 임을 알 수 있다. 이 특성방정식의 해가 바로 행렬의 고유치(eigenvalue)이다. 행렬의 고유치를 구하는 함수는 따로 마련되어 있으며 eig()함수이다.


>> roots(ans)
7.2826
-1.6663 + 4.4321i
-1.6663 - 4.4321i

>> eig(A)
7.2826
-1.6663 + 4.4321i
-1.6663 - 4.4321i


특정한 값에서의 함수값을 구하는 함수는 polyval()함수이다. 예를 들어 x=5에서 p에 저장된 다항식 값을 구하려면


>> polyval(p,5) 󰎠
-634


정방행렬에 대해서 다항식의 값을 구하는 것도 가능하다. 예를 들어서 q(x)=x3-2x-5 라는 함수가 있을때 행렬 A에 대해서 q(A)=A3-2A-5I 가 되는 것이다. 여기서 I는 항등행렬이다. 다항식에 대해서 행렬 계산을 구하는 함수가 polyvalm()함수이다.


>> A=[2 4 5;-1 0 3; 7 1 5]
A =
2 4 5
-1 0 3
7 1 5

>> q=[1 0 -2 -5]
q =
1 0 -2 -5

>> polyvalm(q,A)
377 179 439
111 81 136
490 253 639


위의 결과에 대해서 검산을 하면 다음과 같다.


>> A^3-2*A-5*eye(3) 󰎠
377 179 439
111 81 136
490 253 639


여기서 eye(3)은 3x3 항등행렬을 생성해주는 함수이다.



Posted by 살레시오
,

 MATLAB에서 제공하는 논리 연산자는 다음 표와 같다.


[표 1] 논리 연산자

논리연산자

기능

&

AND

|

OR

~

NOT


(부연하자면 C/C++의 비트연산자와 같다. MATLAB은 비트 연산자는 없다.)

 다음 예를 보자


>> A=magic(3)
A =
8 1 6
3 5 7
4 9 2

>> B=pascal(3)
B =
1 1 1
1 2 3
1 3 6

>> ~(A>B)
0 1 0
0 0 0
0 0 1

>> (A>2)&(B<3)
1 0 1
1 1 0
1 0 0


 이전 포스트에서 설명한 기본 논리/관계연산자 외에도 MATLAB은 추가적인 다양한 논리/관계 함수를 제공한다.


[표 2] 관계/논리 연산 관련 함수들 (X, Y는 함수)

함수명

함수의 기능

Z=xor(X,Y)

XOR 연산을 수행한다

Z=any(X)

벡터 X의 요소 중 하나라도 0이 아닌 요소가 있으면 1을 반환, X가 행렬일때는 열단위로 연산된다.

z=all(X)

벡터 X의 요소들 모두 0이 아니면 1을 반환

(X가 행렬일 때는 열단위로 연산된다.)

z=isempty(X)

행렬 X가 빈행렬이면 1을 반환

z=isequal(X,Y)

행렬 X와 Y가 완전히 동일하면 1을 반환

Z=isinf(X)

행렬 X의 요소 중 inf가 있는 곳에 1을 반환

Z=isnan(X)

행렬 X의 요소 중 nan이 있는 곳에 1을 반환

z=isreal(X)

행렬 X의 요소 중 복소수가 하나도 없으면 1을 반환


위의 도표에서 소문자 z가 출력변수이면 그 함수는 스칼라값(0혹은1)을 반환함을 의미하며 대문자 Z가 출력행렬이면 그 함수는 입력 파라메터와 동일한 크기를 갖는 행렬을 반환한다는 것을 의미한다.


 이 중 isequal()함수는 연산자 (==)와 같은 역할을 하는 것 아닌가 생각할수 있으나 (==)연산자는 요소간 비교이고 isequal()함수는 두 행렬 전체를 비교하는 함수이다. 다음 예에서 이를 확인해 보라.


>> A=[1 2;3 4]
A =
1 2
3 4

>> B=[1 2;3 4]
B =
1 2
3 4

>> C=[1 2; 3 5]
C =
1 2
3 5

>> A==B
1 1
1 1

>> A==C
1 1
1 0

>> isequal(A,B)
1

>> isequal(A,C)
0




Posted by 살레시오
,