File: canon.cat

package info (click to toggle)
scilab 2.6-4
  • links: PTS
  • area: non-free
  • in suites: woody
  • size: 54,632 kB
  • ctags: 40,267
  • sloc: ansic: 267,851; fortran: 166,549; sh: 10,005; makefile: 4,119; tcl: 1,070; cpp: 233; csh: 143; asm: 135; perl: 130; java: 39
file content (60 lines) | stat: -rw-r--r-- 1,824 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
canon            Scilab Group            Scilab Function              canon
NAME
   canon - canonical controllable form
  
CALLING SEQUENCE
 [Ac,Bc,U,ind]=canon(A,B)  
PARAMETERS
 Ac,Bc      : canonical form
            
 U          : current basis (square nonsingular matrix)
            
 ind        : vector of integers, controllability indices
            
DESCRIPTION
   gives the canonical controllable form of the pair (A,B).
  
   Ac=inv(U)*A*U, Bc=inv(U)*B
  
   The vector ind is made of the epsilon_i's indices of the pencil [sI - A ,
   B] (decreasing order). For example with ind=[3,2], Ac and Bc are as
  follows:
  
       [*,*,*,*,*]           [*]
       [1,0,0,0,0]           [0]
 Ac=   [0,1,0,0,0]        Bc=[0]
       [*,*,*,*,*]           [*]
       [0,0,0,1,0]           [0]
   If (A,B) is controllable, by an appropriate choice  of F the * entries of
  Ac+Bc*F  can be arbitrarily set to desired values (pole placement).
  
EXAMPLE
 A=[1,2,3,4,5;
    1,0,0,0,0;
    0,1,0,0,0;
    6,7,8,9,0;
    0,0,0,1,0];
 B=[1,2;
    0,0;
    0,0;
    2,1;
    0,0];
 X=rand(5,5);A=X*A*inv(X);B=X*B;    //Controllable pair 
 [Ac,Bc,U,ind]=canon(A,B);  //Two indices --> ind=[3.2];
 index=1;for k=1:size(ind,'*')-1,index=[index,1+sum(ind(1:k))];end
 Acstar=Ac(index,:);Bcstar=Bc(index,:);
 s=poly(0,'s');
 p1=s^3+2*s^2-5*s+3;p2=(s-5)*(s-3);   
 //p1 and p2 are desired closed-loop polynomials with degrees 3,2
 c1=coeff(p1);c1=c1($-1:-1:1);c2=coeff(p2);c2=c2($-1:-1:1);
 Acstardesired=[-c1,0,0;0,0,0,-c2];  
 //Acstardesired(index,:) is companion matrix with char. pol=p1*p2
 F=Bcstar\(Acstardesired-Acstar);   //Feedbak gain
 Ac+Bc*F         // Companion form 
 spec(A+B*F/U)   // F/U is the gain matrix in original basis.
SEE ALSO
   obsv_mat, cont_mat, ctr_gram, contrss, ppol, contr, stabil
  
AUTHOR
   F.D.