Scilab에서 함수의 정의는 다음과 같이 키워드 function 으로 시작하고 endfunction으로 끝난다.


function [y1, y2, … ] = function_name(x1, x2, …)
      …
      ...
endfunction


출력변수(들)은 대괄호 [ ] 로 묶지만 만약 출력 변수가 하나라면 대괄호는 생략이 가능하다. 입력변수는 괄호 ( )로 묶는데 만약 입력 변수가 없다면 정의에서는 괄호를 생략할 수 있다. 하지만 함수를 호출할 때는 입력 변수가 없다고 하더라도 괄호를 생략하지 못 한다. 함수의 몸체는 Scilab의 문장들(statements)로 작성된다.


 간단한 예로 입력변수를 단순하게 세 제곱하여 반환하는 함수는 다음과 같이 입력할 수 있다.


>> function y=pow3(x)
>> y=x^3
>> endfunction


이렇게 입력하면 pow3()라는 함수가 내부적으로 컴파일 된 후 작업 공간에 올라오며 이 후에 호출할 수 있다. 예를 들어서


>> a=pow(4)

 

라고 호출하면 변수 a에 64가 저장될 것이다.


 또 다른 예로서 숫자 x가 소수(prime number)이면 %t를 아니면 %f 를 반환하는 IsPrime()이라는 함수는 다음과 같다.


function y=isPrime(x)
         for n=2:(x-1)
                   if modulo(x,n)==0 then
                             y=%f
                             return
                  end
         end
         y=%t
endfunction


여기서 함수 내부의 return 명령을 만나면 그 즉시 함수의 실행이 종료되고 호출된 곳으로 되돌아가게 된다. 알고리듬은 2와 x-1 사이의 모든 수로 나누어 보고 한 번이라도 그 나머지가 0이라면 %f를 반환하는 아주 간단한 방법을 사용했다.


 Scilab의 함수는 변수처럼 취급된다. 예를 들어서 입력의 3제곱을 반환하는 다음과 같은  함수를 고려하자.


>> function y=foo(x), y=x^3, endfunction


전술한 바와 같이 이렇게 함수를 정의하면 작업 공간에 이 함수가 올라오게 된다. 그 다음 일반적인 변수에 이 함수를 대입할 수 있다.


>> foo2 = foo


이 명령을 보면 좌변의 새로운 변수에 함수명을 대입했다.  이렇게 되면 함수 본체가 복사되어 새로운 변수 foo2에 대입된다. 이 말은 이후에 원래의 함수 foo를 삭제/변형하더라도 foo2 함수에는 영향을 미치지 않는다는 말이다.


이렇게 함수를 변수처럼 취급할 수 있다는 것은 여러가지 이점이 있다. 함수 자체가 다른 함수의 입력 변수, 혹은 출력 변수가 될 수 있으며 구조체나 리스트의 필드가 될 수도 있다.


 만약 정의된 함수를 삭제하고 싶다면 변수를 삭제할 때와 같이 clear 함수를 이용하면 된다.


>> clear foo
>> clear(‘foo’)


이렇게 원래의 함수 foo()가 삭제되더라도 foo2()함수는 여전히 메모리에 남아있게 된다.




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

 Scilab의 for 명령은 반복을 수행하기 위해서 사용되며. for 와 end 사이의 명령어들을 주어진 변수값을 가지고 반복 수행한다. 간단한 예를 들면 다음과 같다.

--> for n=1:5, disp(n), end


이 명령은 disp(n)이라는 명령을 반복해서 수행하는데 다음과 같은 결과를 표시한다.


         1.
         2.
         3.
         4.
         5.

 

이 예제에서 반복은 벡터에 대해서 수행되었다. 이전에 콜론(:) 연산자는 행벡터를 생성한다고 설명한 바 있다. 따라서 위의 예는 다음과 완전히 동일하다.

--> for n=[1 2 3 4 5], disp(n), end

하지만 전자의 경우가 훨씬 더 간략하므로 만약 등간격의 변수들에 대한 반복을 수행한다면 전자와 같이 사용하는 것이 더 일반적이다. (1부터 1000까지 반복하는 경우라면 후자같이 사용하지는 못할 것이다.)

 만약 1부터 10까지의 숫자 중 홀수에 대해서만 반복을 수행하고 싶다면 다음과 같이 하면 될 것이다.


--> for n=1:2:10, disp(n), end

 

그려면 화면에는 1부터 시작해서 하나씩 건너 뛴 숫자들을 표시할 것이다.


         1.
         3.
         5.
         7.
         9.

 

증분값을 음수로 주면 역순으로 수행할 수도 있다. 예를 들어서


--> for n=5:-1:1, disp(n), end

이라고 하면 화면에 5부터 1까지 역순으로 표시되는 것을 확인할 수 있다.

 for 반복문에서 사용되는 변수값은 꼭 정수뿐만 아니라 다양한 값이 될 수 있다. 실수의 예를 들면 다음과 같다.

--> for n=linspace(0,1,5),disp(n),end
    0.  
    0.25  
    0.5  
    0.75  
    1.  

또는 다음과 같이 실수가 아닌 경우도 된다.


--> for n=[0.1, %i, %pi, %e],disp(n),end
    0.1  
    i    
    3.1415927  
    2.7182818

 

반복 변수에 행렬이 지정될 때에는 그 행렬의 각각의 열벡터로 반복을 수행한다. 예를 들어서

--> for n=[1 2 3;4 5 6], disp(n), end

라는 반복문의 경우 세 번 반복이 수행되는데 각각의 반복문에서 n변수의 값은 [1;4], [2;5], [3;6], 즉 첫 번째 열, 두 번째 열, 그리고 세 번째 열이 된다. 따라서 결과는 다음과 같다.


   1.  
   4.  
   2.  
   5.  

   3.   
   6.  



Posted by 살레시오
,

 scilab에서 어떤 조건이 참인지 거짓인지 판별한는데 if 명령이 사용되며 만약 if 문 바로 뒤의 조건문이 참이라면 명령문들을 수행한다. if 문은 반드시 end문과 쌍을 이루어야 한다. 간단한 예를 들면 다음과 같다.


>> if %t then
     disp(“True!”)
  end


이 예는 if 문 뒤의 진리값이 항상 참이므로 then과 end 사이의 명령이 항상 실행될 것이다. else 문을 이용하면 진리값이 거짓일 경우 수행될 코드를 처리할 수 있다.


>> n=%e;
>> if n==%pi then
       a=1
   else
       a=2
   end


위의 조건 검사문은 if문 뒤의 조건이 거짓이므로 변수 a는 2값을 가질 것이다. 또한 elseif 명령을 이용하여 여러 조건 검사를 한꺼번에 수행할 수도 있다.


>> n=2;
>> if n==%pi then
     a=1
  elseif n==%e then
     a=2
  else
     a=3
  end


위의 예에서 변수 a는 3값을 가지게 될 것이다.


 조건검사에 쓰이는 비교 연산자를 다음 표에 정리하였다.


[표 1] 조건 검사에 사용되는 비교/논리연산자

비교연산자

설명

a==b

(비교연산자) 같다

a~=b 혹은 a<>b

(비교연산자) 다르다

a<b

(비교연산자) 크다

a>b

(비교연산자) 작다

a<=b

(비교연산자) 크거나 같다

a>=b

(비교연산자) 작거나 같다

a & b

(논리연산자) and

a | b

(논리연산자) or

~a

(논리연산자) not


‘같다’를 검사하는 연산자는  == 이며 = 가 아님에 주의해야 한다. 조건식에 대입연산자 =를 사용하면 에러를 발생하게 된다.


 대소비교를 하는 <, >, <=. >= 네 개의 연산자는 피연산자로 오직 실수(행렬)만이 허용됨을 유의해야 한다. 복소수는 수학적으로도 대소 관계가 정의되어 있지 않으므로 Scilab에서도 그것이 허용되지 않는다.


>>1+2*%i < 3
        !--error 144
Undefined operation for the given operands.
check or define function %s_1_s for overloading.

단 ==, ~= (혹은 <>) 연산은 허용된다. 복소수의 경우 실수부와 허수부가 모두 같아야 참(%t)이 반환될 것이다.


 논리 연산자를 사용할 때 한가지 알아두어야 할 점은 피 연산자가 벡터(행렬)인 경우이다. 다음 예들을 보자.


>> [1 2 3] == 1
ans  =
 T F F  

>>[1 2 3] == [1 2]
ans  =
 F  

>>[1 2;3 4] == [1 2; 3 5]
ans  =
 T T  
 T F  


위의 예들에서 보듯이 다음과 같이 정리할 수 있다.


       ➊ 하나가 스칼라, 다른 하나가 행렬일 경우 스칼라와 행렬의 모든 요소를 비교한다.

       ➋ 둘 다 행렬이고 크기가 다를 경우 거짓 (%f)가 반환된다.

       ➌ 둘 다 행렬이고 크기가 같을 경우 같은 위치의 요소끼리 비교한다.


만약 행렬의 상동을 if 문으로 비교할 경우 크기와 모든 요소가 같아야 참으로 간주된다.


>>a=0
>>A=[1 2; 3 4]
>>B=[1 2;3 5]
>>C=[1 2;3 4]
>> if A==B then // [T T; T F]
     a=1;
  elseif A==C then // [T T;T T]
     a=2;
  else
     a=3;
  end


위의 예에서 변수 a는 2값을 가질 것이다.



Posted by 살레시오
,

다항식 생성

 Scilab에서 다항식을 생성하는 함수는 poly() 이다. 예를 들면


>> f = poly( [1 2 3], 'x', 'c') // ‘coeff’
f  =
              2  
   1 + 2x + 3x  
>> g = poly( [1 2 3], 't', 'r') // ‘roots’
g  =
               2   3  
 - 6 + 11t - 6t + t  


위의 예에서 보듯이 poly()함수의 첫 번째 인자는 행벡터이고 두 번째 인자는 다항식 표기에 쓰이는 기호이고 세 번째 인자는 벡터의 요소가 계수(coefficients)인가 근(roots)인가를 지정하는 문자열이다. 세 번째 인자의 기본값은 ‘r’ 이므로 생략하면 이것으로 자동으로 지정된다.

다항식의 기호식(symbolic) 연산

 Scilab에서 특이한 것은 다항식으로 한 번 정의되면 그 변수는 일종의 기호식(symbolic equation)같이 취급되어 기호식 연산을 할 수 있다는 것이다. (아마 기본 연산자가 다르게 동작하도록  오버로딩 되어있는 듯하다.) 예를 들어서


>> s = poly([1 -1],'x','c') // 변수 s는 기호식으로 취급됨
s  =
   1 - x  

>> f = s^3
f  =
              2   3  
   1 - 3x + 3x - x  
>> g = 1+s+s^2
g  =
             2  
   3 - 3x + x  

>> h = g/f
h  =
               2    
     3 - 3x + x      
   ----------------------    
              2   3  
   1 - 3x + 3x - x  


위의 예에서 보듯이 s=x-1 이라는 다항식으로 s가 정의된 이후에는 사칙연산이 다항식에 대한 것으로 바뀌어서 적용이 된다. 변수 h 는 분수식으로 정의되었다.


 단순하게 x를 기호로 설정하려면 다음과 같이 하면 된다.


>> x = poly(0,’x’)


이후에는 변수 x는 다른 객체로 재설정 하지 않는다면 기호로 취급된다. 예를 들어서 분수식 x.(x2+x+1) 를 입력하고 싶다면 그대로 입력하면 된다.


>> k = x/(x^2+x+1)
k  =
        x      
   ---------  
            2  
   1 + x + x  


이렇게 정의된 k 역시 기호식으로 취급된다.


 Scilab의 내부 변수 중에 %s와 %z (소문자이다)가 있는데 이것은 이미 기호식으로 미리 정의가 되어 있는 것이다. 즉 %s=poly(0,’s’), %z=poly(0,’z’) 와 같이 미리 정의 되어 있는 기호이다. Scilab자체가 제어 이론의 구현에서 출발했으므로 전달함수를 표기하는 두 변수 s (연속치 계통의 경우) 와 z (이산치 계통의 경우)를 미리 기호식으로 사용할 수 있도록 설정해 놓은 것으로 짐작된다. 이 두 기호 이외의 다른 기호를 사용하려면 일일이 poly()함수를 사용하여 지정해 주어야 한다.

다항식과 분수식에 관련된 함수들

 다음 표에 다항식과 분수식에 관련된 중요한 함수들과 그 기능을 정리하였다.


[표 1] 다항식 관련 함수들

함수명

기능

roots

다항식의 해를 구한다.

factors

다항식을 인수분해한다.

simp

분수식에 공통분모가 있다면 약분한다.

simp_mode(%t)

simp_mode(%f)

분수식을 자동으로 약분한다.

분수식을 자동으로 약분하지 않는다.

pfss

분수식을 부분 분수 전개한다.

inv

역행렬 계산

det

행렬식 계산


예를 들어서 다항식 s3-1 을  인수분해하려면 다음과 같이 하면 된다.


>> factors(%s^3-1)
  ans  =
    ans(1)
           2  
  1 + s + s  
   ans(2)
   - 1 + s


또한 [1/z 1 1; 1 1 z; 1 z 1] 이라는 3x3행렬의 역행렬을 구하려면 다음과 같이 하면 된다.


       >>inv([1/%z 1 1; 1 1 %z; 1 %z 1])
          ans  =
                  2                      
           - z - z       z         z    
             -----     -----     -----  
           - 1 + z   - 1 + z   - 1 + z  
                              
               z       - 1       0      
             -----     -----     -      
           - 1 + z   - 1 + z     1      
                              
               z       0         - 1    
             -----     -         -----  
           - 1 + z     1       - 1 + z

부분분수 전개는 pfss 함수이다. 예를 들어서 분수식 3/(s3-1)을 부분분수전개하려면 다음과 같이 하면 된다.


         >>pfss(3/(%s^3-1))
          ans  =
                 ans(1)
              - 2 - s    
             ---------  
                      2  
             1 + s + s  
       ans(2)
                1    
             -----  
           - 1 + s   



Posted by 살레시오
,

tlist (typed list)

 tlist는 사용자에게 특수한 데이터 객체를 정의하고 연산자를 재정의할 수 있도록 하는 아주  유용한 기능을 제공한다.  tlist의 첫 번째 인수는 반드시 문자열 (혹은 문자열 벡터) 이어야 한다. 문자열 벡터인 경우 이것의 첫 요소는 정의되는 리스트의 이름이고 나머지 문자열은 뒤따라오는 객체의 이름 (필드명)이 된다. 예를 들면 다음과 같다.


>> tlA=tlist(['example', 'first', 'second'], 1.23, [1,2])
tlA  =
      tlA(1)
!example  first  second  !
      tlA(2)
    1.23  
       tlA(3)
    1.    2.  

>> type(tlA)
ans  =
   16.  

>> typeof(tlA)
ans  =
 example  


이 예에서 tlist()함수의 첫 번째 인수는 다음과 같은 문자열 행렬인데,


[ 'example', 'first', 'second' ]


첫 번째 요소 ‘example’은 이 리스트의 이름을 지정한다. 이 이름은 1024문자까지 지정할 수 있으나 연산자 오버로딩을 하기 위해서는 8자를 넘지 말아야 한다.  그 다음 ‘first’ 는 1.23을 가리키는 문자열키이고 ‘second’는 벡터 [1, 2]를 가리키는 문자열키이다. 예를 들어서 1.23이라는 값에 접근하기 위해서는 다음과 같이 하면 된다.


>> tlA(2) // 혹은
>> tlA(‘first’) // 혹은
>> tlA.first


두 번째 요소도 마찬가지로 접근해서 값을 읽거나 다른 값으로 설정할 수 있다. 만약 두 번째 요소를 문자열로 바꾸고 싶다면 다음과 같이 하면 된다.


>> tlA(2) = = “A new value” // 혹은
>> tlA.second = “A new value”


구조체의 경우와 마찬가지로 tlA.stringKey 와 같은 방식일 경우에는 stringKey는 일반적인 식별자 규칙을 따라야 한다. 하지만 tlA(‘stringKey’)와 같은 방식으로 접근하는 경우에 문자열키는 어떤 문자열이라도 상관없으며, 이 경우 문자열을 조합해서 아니면 문자열벡터의 한 요소로 네임키를 지정해 줄 수 있다는 장점을 가진다.


 똑 같은 tlist 를 다음과 같이 생성할 수도 있는데 구조체의 경우와 유사하다.


>> tlA=tlist(['example', 'first', 'second']) ;
>> tlA.first = 1.23 ;
>> tlA.second = [1 2] ;

mlist

 mlist (matrix-oriented typed list)는 전 절에서 설명한 tlist 와 유사하지만 한 가지 중요한 차이점이 있다. 그것은 필드값을 인덱스로 접근할 수 없다는 점이다.



Posted by 살레시오
,

 맥시마는 내부적으로 미리 정의된 수학 상수들이 있는데 다음 표와 같다.


[표 1] 맥시마의 내부 상수들

기호

의미

%e

자연 상수 (2.718182…)

%pi

원주율 ( 3.1415…)

%i

허수

true, false

참, 거짓

%gamma

Euler-Mascheroni constant, 0.577215…

%phi

황금율 (1+sqrt(5))/2

_ (언더바)

직전 입력

%

직전 출력

inf, minf, infinity

+무한대, -무한대, 무한 복소수

zeroa, zerob

무한소 (infinitesimal above/below zero)

ind

부정수 (indefinite number)

und

undefined number


이 표에 있는 상수 중에서 %e, %i, %pi는 특히 많이 쓰이니 꼭 숙지해야 하며, 입력할 때 %기호를 빠뜨리기 쉬우니 주의해야 한다.


 복소수를 입력하는 것은 허수 %i를 이용한다.



첫 번째는 3i 를 입력한 것이고 두 번째는 복소수 4-5i 를 생성하여 변수 a에 대입하는 것이다. 5와 %i 사이의 곱(*) 기호를 빠뜨리면 안된다.


 지수함수 ex를 입력하는데 %e 상수를 이용할수도 있고 exp(x)함수를 이용할 수 도 있다. 두 방법은 동일하다.



 어떤 상수의 실수 근사값을 알고 싶다면 float()함수를 이용하거나 ‘, numer’ 명령을 이용한다.




Posted by 살레시오
,

 산술 연산은 타 프로그래밍 언어에서도  거의 공통적으로 쓰이는 기호가 맥시마에서도 사용된다. 맥시마는 수를 표현하는 방식에서 ‘기호 형식’과 ‘수치 형식’이 있으며 (numer 라는 내부 변수에 의해서 지정됨.) 기본적으로 초기에는 기호 형식으로 동작한다. 이 두 가지 형식의 차이점을 예를 들어서 설명하면 다음과 같다. 기호모드에서는 1/11 이라는 분수를 그냥 분수의 형태로 저장하며 사실 이 수는 이 형태가 정확한 표현인 것이다. 그러나 수치모드에서는 이 숫자를 입력하면 0.090909090909091 와 같이 소수형식으로 표현되며 엄밀히 얘기하면 이 수는 1/11 의 근사값이다. 다음 [표 1]에 Maxima에서 쓰이는 산술연산기호를 정리하였다.

[표 1] 맥시마의 산술 연산자

기호

작업

비고

+

덧셈

※내부 변수 numer 의 진리값에 따라 표시 결과가 다름

-

뺄셈

*

곱셈

/

나눗셈

^

거듭 제곱



똑같은 명령어라도 수치 형식인 경우는 결과가 달라진다. 내부 변수와 변수에 값을 지정하는 방법은 뒤에서 다루어지므로 여기에서는 그냥 결과만 확인하자.



여기에서 numer:true 명령은 numer라는 내부 변수에 true라는 값을 대입하는 것이다. 맥시마는 특이하게 대입 연산자가 콜론(:)이다.


 만약 현재 모드를 바꾸지 않고 특정 수식의 실수 값을 확인하고 싶으면 float()함수를 사용하거나 표현식 뒤에 ‘, numer’라고 추가입력하면 된다.



 산술연산 기호를 이용하면 Maxima에는 대수식이나 방정식과 같은 것들도 쉽게 표현할 수 있다. 만약 x2+2x+1,1/(y2+1)이라는 대수식을 입력하려면 아래와 같이 하면 된다.



 연습 문제로 다음과 같은 식을 입력하고 확인해 보자.



Posted by 살레시오
,

 wxMaxima를 설치하고 실행시키면 명령어를 입력할 수 있는 윈도우가 실행된다. wxMaxima에서는 입력 명령어와 출력 결과가 하나의 쌍으로 표시되며 화면 왼편에 다음 그림과 같은 모양의 바가 표시 되는데 이것을 셀(cell)이라고 칭한다.


[그림 1[ 명령 입력 단위인 셀(cell)


하나의 셀을 가리키는 이 바의 상단의 작은 삼각형을 클릭하면 셀의 내용을 접었다 폈다 할 수 있다. 이제 이곳에 명령어를 타이핑해서 입력하면 그 계산결과가 바로 같은 셀 안에 표시된다.

 처음에 wxMaxima에서 주의할 것은 명령을 입력하려면 그냥 [Enter]키가 아니라 󰍬[Shift]+[Enter] 를 눌러야 명령이 입력된다는 것이다. 하나의 명령이 끝났다는 표시는 세미콜론(;) 혹은 달러($)표시를 명령 끝에 타이핑하면 되지만, [Shift]+[Enter]를 입력하면 자동으로 명령 끝에 세미콜론(;)이 붙고 결과가 표시된다.



 한 줄에 여러 개의 명령을 입력하고 싶을 때는 세미콜론(;) 또는 달러($)로 구분하면 되며, 차이점으로는 달러($)로 끝나는 명령의 출력은 화면에 표시되지 않는다는 것이다. 다음 예에서 x^2+2*x$ 명령은 $로 끝났기 때문에 결과가 화면에 표시되지 않는다.



위에서 sqrt()함수는 제곱근(square root) 값을 입력하는데 사용된다. sin( ), cos( )함수는 각각 사인함수와 코사인함수를 입력하는데 사용된다. 사인함수를 입력하는데 그냥 sinx라고 하면 안 되고 반드시 독립변수에 괄호를 쳐서 sin(x)라고 입력해야 됨에 유의하자.




Posted by 살레시오
,