Mercurial > hg > octave-lyh
diff scripts/control/system/sysmin.m @ 7135:8aa770b6c5bf
[project @ 2007-11-08 18:54:10 by jwe]
author | jwe |
---|---|
date | Thu, 08 Nov 2007 18:54:10 +0000 |
parents | a1dbe9d80eee |
children |
line wrap: on
line diff
--- a/scripts/control/system/sysmin.m +++ b/scripts/control/system/sysmin.m @@ -51,17 +51,22 @@ function [retsys, nc, no, cflg, oflg] = sysmin (sys, flg) - switch(nargin) - case(1), flg = 0; - case(2), jnk = flg; # dummy operation + switch (nargin) + case 1 + flg = 0; + case 2 + jnk = flg; # dummy operation otherwise, print_usage (); endswitch - dflg = is_digital(sys,2); - [n,nz,m,p] = sysdimensions(sys); - if(n*nz > 0) + + dflg = is_digital (sys, 2); + + [n, nz, m, p] = sysdimensions (sys); + + if (n*nz > 0) # both continuous and discrete states - [aa,bb,cc,dd,tsam,n,nz,stnam,innam,outnam,yd] = sys2ss(sys); + [aa, bb, cc, dd, tsam, n, nz, stnam, innam, outnam, yd] = sys2ss (sys); crng = 1:n; drng = n+(1:nz); @@ -77,24 +82,26 @@ cstnam = stnam(crng); dstnam = stnam(drng); - cinnam = __sysconcat__(innam,stnam(drng)); - coutnam = __sysconcat__(outnam,stnam(drng)); - csys = ss(Ac,[Bc,Acd],[Cc;Adc]); - csys = syssetsignals(csys,"st",cstnam); - csys = syssetsignals(csys,"in",cinnam); - csys = syssetsignals(csys,"out",coutnam); + cinnam = __sysconcat__ (innam, stnam(drng)); + coutnam = __sysconcat__ (outnam, stnam(drng)); + csys = ss (Ac, [Bc, Acd], [Cc; Adc]); + csys = syssetsignals (csys, "st", cstnam); + csys = syssetsignals (csys, "in", cinnam); + csys = syssetsignals (csys, "out", coutnam); # reduce continuous system, recombine with discrete part - csys = sysmin(csys,flg); - cn = sysdimensions(csys); + csys = sysmin (csys, flg); + cn = sysdimensions (csys); - if(cn == 0) + if (cn == 0) # continuous states are removed; just reduce the discrete part - sys = sysprune(sys,1:p,1:m,drng); - retsys = sysmin(sys,flg); + sys = sysprune (sys, 1:p, 1:m, drng); + retsys = sysmin (sys, flg); else # extract updated parameters from reduced continuous system - [caa,cbb,ccc,cdd,ctsam,cn,cnz,cstnam,cinnam,coutnam] = sys2ss(csys); + [caa, cbb, ccc, cdd, ctsam, cn, cnz, cstnam, cinnam, coutnam] ... + = sys2ss (csys); + crng = 1:cn; Ac = caa; Bc = cbb(:,1:m); @@ -103,45 +110,45 @@ Adc = ccc(p + (1:nz),:); # recombine to reduce discrete part of the system - dinnam = __sysconcat__(innam,cstnam); - doutnam = __sysconcat__(outnam,cstnam); - dsys = ss(Ad,[Bd,Adc],[Cd;Acd],[],tsam); - dsys = syssetsignals(dsys,"st",dstnam); - dsys = syssetsignals(dsys,"in",dinnam); - dsys = syssetsignals(dsys,"out",doutnam); + dinnam = __sysconcat__ (innam, cstnam); + doutnam = __sysconcat__ (outnam, cstnam); + dsys = ss (Ad, [Bd, Adc], [Cd; Acd], [], tsam); + dsys = syssetsignals (dsys, "st", dstnam); + dsys = syssetsignals (dsys, "in", dinnam); + dsys = syssetsignals (dsys, "out", doutnam); # reduce discrete subsystem - dsys = sysmin(dsys); - [n1,nz] = sysdimensions(dsys); - if(nz == 0) + dsys = sysmin (dsys); + [n1, nz] = sysdimensions (dsys); + if (nz == 0) # discrete subsystem is not needed - retsys = sysprune(csys,1:p,1:m); + retsys = sysprune (csys, 1:p, 1:m); else # combine discrete, continuous subsystems - [Ad,dbb,dcc] = sys2ss(dsys); - dstnam = sysgetsignals(dsys,"st"); + [Ad, dbb, dcc] = sys2ss (dsys); + dstnam = sysgetsignals (dsys, "st"); Bd = dbb(:,1:m); Adc = dbb(:,m+(1:cn)); Cd = dcc(1:p,:); Acd = dcc(p+(1:cn),:); - stnam = __sysconcat__(cstnam,dstnam); + stnam = __sysconcat__ (cstnam, dstnam); aa = [Ac, Acd; Adc, Ad]; bb = [Bc; Bd]; cc = [Cc, Cd]; - retsys = ss([Ac, Acd; Adc, Ad], [Bc ; Bd], [Cc, Cd], dd, tsam, ... - cn, nz, stnam, innam, outnam, find(yd == 1)); - end + retsys = ss ([Ac, Acd; Adc, Ad], [Bc ; Bd], [Cc, Cd], dd, tsam, + cn, nz, stnam, innam, outnam, find(yd == 1)); + endif endif else - Ts = sysgettsam(sys); - switch(flg) - case(0), + Ts = sysgettsam (sys); + switch (flg) + case 0 ## reduce to a minimal system - [aa,bb,cc,dd] = sys2ss(sys); - [cflg,Uc] = is_controllable(aa,bb); - if(!cflg) + [aa, bb, cc, dd] = sys2ss (sys); + [cflg, Uc] = is_controllable (aa, bb); + if (! cflg) ## reduce to controllable states - if(!isempty(Uc)) + if (! isempty (Uc)) aa = Uc'*aa*Uc; bb = Uc'*bb; cc = cc*Uc; @@ -149,10 +156,10 @@ aa = bb = cc = []; endif endif - if(!isempty(aa)) - [oflg,Uo] = is_observable(aa,cc); - if(!oflg) - if(!isempty(Uo)) + if (! isempty (aa)) + [oflg, Uo] = is_observable (aa, cc); + if (! oflg) + if (! isempty (Uo)) aa = Uo'*aa*Uo; bb = Uo'*bb; cc = cc*Uo; @@ -161,32 +168,40 @@ endif endif endif - switch(dflg) - case(0), - nc = no = nn = columns(aa); + switch (dflg) + case 0 + nc = no = nn = columns (aa); nz = 0; - case(1), - nc = no = nz = columns(aa); + case 1 + nc = no = nz = columns (aa); nn = 0; endswitch - innam = sysgetsignals(sys,"in"); - outnam= sysgetsignals(sys,"out"); - retsys = ss(aa,bb,cc,dd,Ts,nn,nz,[],innam,outnam); - case(1), + innam = sysgetsignals (sys, "in"); + outnam= sysgetsignals (sys, "out"); + retsys = ss (aa, bb, cc, dd, Ts, nn, nz, [], innam, outnam); + case 1 ## reduced model with physical states - [cflg,Uc] = is_controllable(sys); xc = find(max(abs(Uc')) != 0); - [oflg,Uo] = is_observable(sys); xo = find(max(abs(Uo')) != 0); - xx = intersection(xc,xo); - if(isempty(xx)) xx = 0; endif # signal no states in reduced model - retsys = sysprune(sys,[],[],xx); - otherwise, + [cflg, Uc] = is_controllable (sys); + xc = find (max (abs (Uc')) != 0); + [oflg, Uo] = is_observable (sys); + xo = find (max (abs (Uo')) != 0); + xx = intersection (xc, xo); + ## signal no states in reduced model + if (isempty (xx)) + xx = 0; + endif + retsys = sysprune (sys, [], [], xx); + otherwise error ("invalid value of flg = %d", flg); endswitch - if(sysdimensions(retsys,"st") > 0) - [cflg,Uc] = is_controllable(retsys); nc = columns(Uc); - [oflg,Uo] = is_observable(retsys); no = columns(Uo); + if (sysdimensions (retsys, "st") > 0) + [cflg, Uc] = is_controllable (retsys); + nc = columns (Uc); + [oflg, Uo] = is_observable (retsys); + no = columns (Uo); else nc = no = 0; endif endif + endfunction