Mercurial > hg > octave-nkf
diff scripts/control/system/syssub.m @ 7136:59dcf01bb3e3
[project @ 2007-11-08 20:18:25 by jwe]
author | jwe |
---|---|
date | Thu, 08 Nov 2007 20:18:26 +0000 |
parents | a1dbe9d80eee |
children |
line wrap: on
line diff
--- a/scripts/control/system/syssub.m +++ b/scripts/control/system/syssub.m @@ -47,72 +47,79 @@ function sys = syssub (varargin) - if(nargin < 1) + if (nargin < 1) print_usage (); endif ## collect all arguments arglist = {}; - for kk=1:nargin + for kk = 1:nargin arglist{kk} = varargin{kk}; - if(!isstruct(arglist{kk})) - error("syssub: argument %d is not a data structure",kk); + if (! isstruct (arglist{kk})) + error ("syssub: argument %d is not a data structure", kk); endif endfor ## check system dimensions - [n,nz,mg,pg,Gyd] = sysdimensions(arglist{1}); - for kk=2:nargin - [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) - error("arg 1 has %d outputs; arg %d has vs %d outputs",pg,kk,ph); - elseif(norm(Gyd - Hyd)) - warning("cannot add a discrete output to a continuous output"); - error("Output type mismatch: arguments 1 and %d\n",kk); + [n, nz, mg, pg, Gyd] = sysdimensions (arglist{1}); + for kk = 2:nargin + [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) + error ("arg 1 has %d outputs; arg %d has vs %d outputs", pg, kk, ph); + elseif (norm (Gyd - Hyd)) + warning ("cannot add a discrete output to a continuous output"); + error ("Output type mismatch: arguments 1 and %d", kk); endif endfor ## perform the subtract - if(nargin == 2) + if (nargin == 2) Gsys = arglist{1}; Hsys = arglist{2}; - if( strcmp(sysgettype(Gsys),"tf") | strcmp(sysgettype(Hsys),"tf") ) + if (strcmp (sysgettype (Gsys), "tf") || strcmp (sysgettype (Hsys), "tf")) ## see if subtracting transfer functions with identical denominators - [Gnum,Gden,GT,Gin,Gout] = sys2tf(Gsys); - [Hnum,Hden,HT,Hin,Hout] = sys2tf(Hsys); - if(length(Hden) == length(Gden) ) - if( (Hden == Gden) & (HT == GT) ) - sys = tf(Gnum-Hnum,Gden,GT,Gin,Gout); - return + [Gnum, Gden, GT, Gin, Gout] = sys2tf (Gsys); + [Hnum, Hden, HT, Hin, Hout] = sys2tf (Hsys); + if (length (Hden) == length (Gden)) + if ((Hden == Gden) & (HT == GT)) + sys = tf (Gnum-Hnum, Gden, GT, Gin, Gout); + return; endif ## if not, we go on and do the usual thing... endif endif ## make sure in ss form - Gsys = sysupdate(Gsys,"ss"); - Hsys = sysupdate(Hsys,"ss"); + Gsys = sysupdate (Gsys, "ss"); + Hsys = sysupdate (Hsys, "ss"); ## change signal names to avoid warning messages from sysgroup - Gsys = syssetsignals(Gsys,"in",__sysdefioname__(length(Gin),"Gin_u")); - Gsys = syssetsignals(Gsys,"out",__sysdefioname__(length(Gout),"Gout_u")); - Hsys = syssetsignals(Hsys,"in",__sysdefioname__(length(Hin),"Hin_u")); - Hsys = syssetsignals(Hsys,"out",__sysdefioname__(length(Hout),"Hout_u")); + Gsys = syssetsignals (Gsys, "in", + __sysdefioname__(length(Gin), "Gin_u")); + + Gsys = syssetsignals (Gsys, "out", + __sysdefioname__(length(Gout), "Gout_u")); - sys = sysgroup(Gsys,Hsys); + Hsys = syssetsignals (Hsys, "in", + __sysdefioname__(length(Hin), "Hin_u")); - eyin = eye(mg); - eyout = eye(pg); + Hsys = syssetsignals (Hsys, "out", + __sysdefioname__(length(Hout), "Hout_u")); + + sys = sysgroup (Gsys, Hsys); + + eyin = eye (mg); + eyout = eye (pg); sys = sysscale (sys, [eyout, -eyout], [eyin; eyin], Gout, Gin); else ## multiple systems (or a single system); combine together one by one sys = arglist{1}; - for kk=2:length(arglist) - sys = syssub(sys,arglist{kk}); + for kk = 2:length(arglist) + sys = syssub (sys, arglist{kk}); endfor endif