Mercurial > hg > octave-lyh
diff scripts/control/system/sysgroup.m @ 5568:e9cde940b271
[project @ 2005-12-08 02:28:22 by jwe]
author | jwe |
---|---|
date | Thu, 08 Dec 2005 02:28:22 +0000 |
parents | 4c8a2e4e0717 |
children | 34f96dd5441b |
line wrap: on
line diff
--- a/scripts/control/system/sysgroup.m +++ b/scripts/control/system/sysgroup.m @@ -59,145 +59,137 @@ function sys = sysgroup (varargin) - save_warn_empty_list_elements = warn_empty_list_elements; - unwind_protect - warn_empty_list_elements = 0; - - if(nargin < 1) - usage("sys = sysgroup(Asys{,Bsys,...})"); - endif + if(nargin < 1) + usage("sys = sysgroup(Asys{,Bsys,...})"); + endif - ## collect all arguments - arglist = {}; - for kk=1:nargin - arglist(kk) = varargin{kk}; - if(!isstruct(arglist{kk})) + ## collect all arguments + arglist = {}; + for kk=1:nargin + arglist(kk) = varargin{kk}; + if(!isstruct(arglist{kk})) error("sysgroup: argument %d is not a data structure",kk); - endif - endfor + endif + endfor - if(nargin == 2) - ## the usual case; group the two systems together - Asys = arglist{1}; - Bsys = arglist{2}; + if(nargin == 2) + ## the usual case; group the two systems together + Asys = arglist{1}; + Bsys = arglist{2}; - ## extract information from Asys, Bsys to consruct sys - Asys = sysupdate(Asys,"ss"); - Bsys = sysupdate(Bsys,"ss"); - [n1,nz1,m1,p1] = sysdimensions(Asys); - [n2,nz2,m2,p2] = sysdimensions(Bsys); - [Aa,Ab,Ac,Ad,Atsam,An,Anz,Ast,Ain,Aout,Ayd] = sys2ss(Asys); - [Ba,Bb,Bc,Bd,Btsam,Bn,Bnz,Bst,Bin,Bout,Byd] = sys2ss(Bsys); - nA = An + Anz; - nB = Bn + Bnz; + ## extract information from Asys, Bsys to consruct sys + Asys = sysupdate(Asys,"ss"); + Bsys = sysupdate(Bsys,"ss"); + [n1,nz1,m1,p1] = sysdimensions(Asys); + [n2,nz2,m2,p2] = sysdimensions(Bsys); + [Aa,Ab,Ac,Ad,Atsam,An,Anz,Ast,Ain,Aout,Ayd] = sys2ss(Asys); + [Ba,Bb,Bc,Bd,Btsam,Bn,Bnz,Bst,Bin,Bout,Byd] = sys2ss(Bsys); + nA = An + Anz; + nB = Bn + Bnz; - if(p1*m1*p2*m2 == 0) + if(p1*m1*p2*m2 == 0) error("sysgroup: argument lacks inputs and/or outputs"); - elseif((Atsam + Btsam > 0) & (Atsam * Btsam == 0) ) + elseif((Atsam + Btsam > 0) & (Atsam * Btsam == 0) ) warning("sysgroup: creating combination of continuous and discrete systems") - elseif(Atsam != Btsam) + elseif(Atsam != Btsam) error("sysgroup: Asys.tsam=%e, Bsys.tsam =%e", Atsam, Btsam); - endif + endif + + if(nA*nB > 0) + A12 = zeros(nA,nB); + else + A12 = []; + endif + A = [Aa,A12; A12', Ba]; + + if(nA*m2 > 0) + B12 = zeros(nA,m2); + else + B12 = []; + endif + if(nB*m1 > 0) + B21 = zeros(nB,m1); + else + B21 = []; + endif + if(isempty(Ab)) + Ab = []; + endif + if(isempty(Bb)) + Bb = []; + endif + B = [Ab, B12; B21, Bb]; + + if(p1*nB > 0) + C12 = zeros(p1,nB); + else + C12 = []; + endif + if(p2*nA > 0) + C21 = zeros(p2,nA); + else + C21 = []; + endif + C = [Ac, C12; C21,Bc]; - if(nA*nB > 0) - A12 = zeros(nA,nB); - else - A12 = []; - endif - A = [Aa,A12; A12', Ba]; - - if(nA*m2 > 0) - B12 = zeros(nA,m2); - else - B12 = []; - endif - if(nB*m1 > 0) - B21 = zeros(nB,m1); - else - B21 = []; - endif - if(isempty(Ab)) - Ab = []; - endif - if(isempty(Bb)) - Bb = []; - endif - B = [Ab, B12; B21, Bb]; - - if(p1*nB > 0) - C12 = zeros(p1,nB); - else - C12 = []; - endif - if(p2*nA > 0) - C21 = zeros(p2,nA); - else - C21 = []; - endif - C = [Ac, C12; C21,Bc]; - - if(p1*m2 > 0) - D12 = zeros(p1,m2); - else - D12 = []; - endif - if(p2*m1 > 0) - D21 = zeros(p2,m1); - else - D21 = []; - endif - D = [Ad, D12; D21, Bd]; - tsam = max(Atsam,Btsam); + if(p1*m2 > 0) + D12 = zeros(p1,m2); + else + D12 = []; + endif + if(p2*m1 > 0) + D21 = zeros(p2,m1); + else + D21 = []; + endif + D = [Ad, D12; D21, Bd]; + tsam = max(Atsam,Btsam); + + ## construct combined signal names; stnames must check for pure gain blocks + if(isempty(Ast)) + stname = Bst; + elseif(isempty(Bst)) + stname = Ast; + else + stname= __sysconcat__(Ast,Bst); + endif + inname = __sysconcat__(Ain,Bin); + outname = __sysconcat__(Aout,Bout); - ## construct combined signal names; stnames must check for pure gain blocks - if(isempty(Ast)) - stname = Bst; - elseif(isempty(Bst)) - stname = Ast; - else - stname= __sysconcat__(Ast,Bst); - endif - inname = __sysconcat__(Ain,Bin); - outname = __sysconcat__(Aout,Bout); - - ## Sort states into continous first, then discrete - dstates = ones(1,(nA+nB)); - if(An) + ## Sort states into continous first, then discrete + dstates = ones(1,(nA+nB)); + if(An) dstates(1:(An)) = zeros(1,An); - endif - if(Bn) + endif + if(Bn) dstates((nA+1):(nA+Bn)) = zeros(1,Bn); - endif - [tmp,pv] = sort(dstates); - A = A(pv,pv); - B = B(pv,:); - C = C(:,pv); - stname = stname(pv); + endif + [tmp,pv] = sort(dstates); + A = A(pv,pv); + B = B(pv,:); + C = C(:,pv); + stname = stname(pv); - ## check for duplicate signal names - inname = __sysgroupn__ (inname, "input"); - stname = __sysgroupn__ (stname, "state"); - outname = __sysgroupn__ (outname, "output"); + ## check for duplicate signal names + inname = __sysgroupn__ (inname, "input"); + stname = __sysgroupn__ (stname, "state"); + outname = __sysgroupn__ (outname, "output"); - ## mark discrete outputs - outlist = find([Ayd, Byd]); + ## mark discrete outputs + outlist = find([Ayd, Byd]); - ## build new system - sys = ss(A,B,C,D,tsam,An+Bn,Anz+Bnz,stname,inname,outname); + ## build new system + sys = ss(A,B,C,D,tsam,An+Bn,Anz+Bnz,stname,inname,outname); - else - ## multiple systems (or a single system); combine together one by one - sys = arglist{1}; - for kk=2:length(arglist) + else + ## multiple systems (or a single system); combine together one by one + sys = arglist{1}; + for kk=2:length(arglist) printf("sysgroup: kk=%d\n",kk); sys = sysgroup(sys,arglist{kk}); - endfor - endif - - unwind_protect_cleanup - warn_empty_list_elements = save_warn_empty_list_elements; - end_unwind_protect + endfor + endif endfunction