1
function [ac,bc,u,ind]=canon(a,b)
2
//[ac,bc,u,ind]=canon(a,b) gives the canonical controllable form
5
//ind controllability indices,
7
//u current basis i.e. ac=inv(u)*a*u,bc=inv(u)*b
9
//See also : obsv_mat, cont_mat, ctr_gram, contrss
10
//Author:F. D. (Inria)
12
//1: block-hessenberg form
14
[ac,bc,u,ro]=contr(a,b,[1.d-10*norm([a,b],1),1.d-10]);
15
//2:zeroing what is th the right of under-diagonal blocks
16
[na,ni]=size(b);[l,k]=size(ro);k0=na+1;k1=k0-ro(k);
18
k2=k1-ro(kk-1);rows=k1:k0-1;cols=k1:na;intsc=k2:k1-1;
19
i=eye(na,na);i(intsc,cols)=-ac(rows,intsc)\ac(rows,cols);
20
im1=2*eye()-i;ac=im1*ac*i,bc=im1*bc;u=u*i;k0=k1;k1=k2;
22
//3: compression of under-the-diagonal blocks
23
i=eye(na,na);n=1;m=ro(1)+1;
25
c=n:n+ro(kk)-1;z=ac(m:m+ro(kk+1)-1,c);
26
[x,s,v]=svd(z);i(c,c)=v;n=n+ro(kk);m=m+ro(kk+1);
28
ac=i'*ac*i,bc=i'*bc;u=u*i;
29
//4. normalization of blocks
30
j=eye(na,na);i=eye(na,na);k0=na+1;k1=k0-ro(k);
32
k2=k1-ro(kk-1);rows=k1:k0-1;long=k2:k2+k0-k1-1;
33
i=eye(na,na);j=eye(na,na);
34
z=ac(rows,long);j(long,long)=z;
36
ac=j*ac*i,bc=j*bc;u=u*i;k0=k1;k1=k2;
38
// controllability indices
39
ind=0*ones(1,ni);[xx,mi]=size(ro);
40
for k=1:ni,for kk=1:mi,
41
if ro(kk)>=k then ind(k)=ind(k)+1;end;
46
index=sum(ro(1:k))+1;v(k+1)=index;
52
v(kmin:kmax)=v(k0:k0+numb-1)+ones(1,ind(kk));
55
ac=ac(v,v),bc=bc(v,:),u=u(:,v);