Mercurial > hg > octave-nkf
diff scripts/control/system/sysadd.m @ 4771:b8105302cfe8
[project @ 2004-02-16 17:45:50 by jwe]
author | jwe |
---|---|
date | Mon, 16 Feb 2004 17:45:50 +0000 |
parents | c05051baf03b |
children | 4c8a2e4e0717 |
line wrap: on
line diff
--- a/scripts/control/system/sysadd.m +++ b/scripts/control/system/sysadd.m @@ -50,18 +50,18 @@ endif ## collect all arguments - arglist = list(); + arglist = {}; for kk=1:nargin - arglist(kk) = varargin{kk}; - if(!isstruct(nth(arglist,kk))) + arglist{kk} = varargin{kk}; + if(!isstruct(arglist{kk})) error("sysadd: argument %d is not a data structure",kk); endif endfor ## check system dimensions - [n,nz,mg,pg,Gyd] = sysdimensions(nth(arglist,1)); + [n,nz,mg,pg,Gyd] = sysdimensions(arglist{1}); for kk=2:nargin - [n,nz,mh,ph,Hyd] = sysdimensions(nth(arglist,kk)); + [n,nz,mh,ph,Hyd] = sysdimensions(arglist{kk}); if(mg != mh) error("arg 1 has %d inputs; arg %d has vs %d inputs",mg,kk,mh); elseif(pg != ph) @@ -74,29 +74,32 @@ ## perform the add if (nargin == 2) - Gsys = nth(arglist,1); - Hsys = nth(arglist,2); + Gsys = arglist{1}; + Hsys = arglist{2}; - if (! strcmp (sysgettype (Gsys), "tf")) + # check if adding scalar transfer functions with identical denoms + [Gn, Gnz, Gm, Gp] = sysdimensions(Gsys); + [Hn, Hnz, Hm, Hp] = sysdimensions(Hsys); + if ( Gm ==1 & Gp == 1 & Hm == 1 & Hp == 1 & Gn == Hn & Gnz == Hnz ) + # dimensions are compatible, check if can add [Gnum,Gden,GT,Gin,Gout] = sys2tf(Gsys); - endif - - if (! strcmp (sysgettype (Hsys),"tf")) [Hnum,Hden,HT,Hin,Hout] = sys2tf(Hsys); - endif + if (length(Hden) == length(Gden) ) + if( (Hden == Gden) & (HT == GT) ) + sys = tf(Gnum+Hnum,Gden,GT,Gin,Gout); - ## see if adding transfer functions with identical denominators - if (length(Hden) == length(Gden) ) - if( (Hden == Gden) & (HT == GT) ) - sys = tf2sys(Gnum+Hnum,Gden,GT,Gin,Gout); - return + return; # return prematurely since the add is done. + endif endif - ## if not, we go on and do the usual thing... endif ## make sure in ss form Gsys = sysupdate(Gsys,"ss"); Hsys = sysupdate(Hsys,"ss"); + Gin = sysgetsignals(Gsys,"in"); + Gout = sysgetsignals(Gsys,"out"); + Hin = sysgetsignals(Hsys,"in"); + Hout = sysgetsignals(Hsys,"out"); ## change signal names to avoid warning messages from sysgroup Gsys = syssetsignals(Gsys,"in",__sysdefioname__(length(Gin),"Gin_u")); @@ -113,9 +116,9 @@ else ## multiple systems (or a single system); combine together one by one - sys = nth(arglist,1); + sys = arglist{1}; for kk=2:length(arglist) - sys = sysadd(sys,nth(arglist,kk)); + sys = sysadd(sys,arglist{kk}); endfor endif