다항식 생성

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

 여기서는 이전 포스트에 이어서 다항식 관련 함수들에 대해서 알아보겠다. 두 다항식의 곱셈은 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 살레시오
,