diff options
Diffstat (limited to 'modules/cacsd/macros/des2ss.sci')
-rwxr-xr-x | modules/cacsd/macros/des2ss.sci | 56 |
1 files changed, 56 insertions, 0 deletions
diff --git a/modules/cacsd/macros/des2ss.sci b/modules/cacsd/macros/des2ss.sci new file mode 100755 index 000000000..fed1f619e --- /dev/null +++ b/modules/cacsd/macros/des2ss.sci @@ -0,0 +1,56 @@ +// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab +// Copyright (C) INRIA - +// +// This file must be used under the terms of the CeCILL. +// This source file is licensed as described in the file COPYING, which +// you should have received as part of this distribution. The terms +// are also available at +// http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.txt + + +function [s1]=des2ss(a,b,c,d,e,tol) + //descriptor to state-space + //! + + [lhs,rhs]=argn(0) + if rhs==1 then + [a,b,c,d,e]=a(2:6); + // if norm(d,1)<>0 then warning('des2ss: d matrix must be zero!');end + [bfs,bis,chis]=glever(e,a); + s1=c*tf2ss(bfs/chis)*b;s1(5)=-c*bis*b+d; + return; + end + if rhs == 5 then tol=1.e-8;end + [ns,ns] = size(a); + if norm(e,1) < %eps then s1=syslin([],[],[],[],-c/a*b + d);return;end + [ue,se,ve,rk] = svd(e,tol*norm(e,1)); + k=ns-rk; + if k==0 then ei=inv(e),s1=syslin([],ei*a,ei*b,c,d),return,end + u1=ue(:,1:ns-k); u2=ue(:,ns-k+1:ns); + v1=ve(:,1:ns-k); v2=ve(:,ns-k+1:ns); + if k==0 then u2=1,v2=1;end + a22=u2'*a*v2; + if rcond(a22) < 1.d-4 then + // higher index... + s=poly(0,"s");[ws,fs1]=rowshuff(s*e-a); + ww=inv(syslin("c",[],[],[],fs1)); + s1=c*ww*ws*b+d; + return + end + sei=sqrtm(inv(se(1:ns-k,1:ns-k))); + //sei=(se(1:ns-k,1:ns-k))^(-0.5) + a11=u1'*a*v1; + a12=u1'*a*v2; + a21=u2'*a*v1; + // index one... + a22i=inv(a22); + bb1 = u1'*b; + bb2 = u2'*b; + cc1 = c*v1; + cc2 = c*v2; + aa = sei * (a11 - a12*a22i*a21) * sei; + bb = sei * (bb1 - a12*a22i*bb2); + cc = (cc1 - cc2 * a22i * a21) * sei; + dd = d - cc2 * a22i * bb2; + s1=syslin([],aa,bb,cc,dd); +endfunction |