Mercurial > hg > octave-nkf
diff scripts/control/sysadd.m @ 3213:ba1c7cdc6090
[project @ 1998-11-06 16:15:36 by jwe]
author | jwe |
---|---|
date | Fri, 06 Nov 1998 16:16:31 +0000 |
parents | |
children | dbcc24961c44 |
line wrap: on
line diff
new file mode 100644 --- /dev/null +++ b/scripts/control/sysadd.m @@ -0,0 +1,97 @@ +# Copyright (C) 1996 A. Scottedward Hodel +# +# This file is part of Octave. +# +# Octave is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 2, or (at your option) any +# later version. +# +# Octave is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# for more details. +# +# You should have received a copy of the GNU General Public License +# along with Octave; see the file COPYING. If not, write to the Free +# Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. + +function sys = sysadd(Gsys,Hsys) +# +# [sys] = sysadd(Gsys,Hsys) +# +# +# returns transfer function sys = Gsys + Hsys +# +# Method: Gsys and Hsys are connected in parallel +# The vector are connected to both systems; the outputs will be +# added. The names given to the system will be the G systems names. +# +# ________ +# ----| Gsys |--- +# u | ---------- +| +# ----- (_)----> y +# | ________ +| +# ----| Hsys |--- +# -------- + +# Written by John Ingram July 1996 +# $Revision: 1.2 $ + + save_val = implicit_str_to_num_ok; # save for later + implicit_str_to_num_ok = 1; + + if(nargin != 2) + usage("sysadd: [sys] = sysysadd(Gsys,Hsys)"); + endif + + # check inputs + if(!is_struct(Gsys) | !is_struct(Hsys)) + error("Both Gsys and Hsys must be in system data structure form"); + endif + + # check for compatibility + [n,nz,mg,pg] = sysdimensions(Gsys); + [n,nz,mh,ph] = sysdimensions(Hsys); + if(mg != mh) + error(sprintf("Gsys inputs(%d) != Hsys inputs (%d)",mg,mh)); + elseif(pg != ph) + error(sprintf("Gsys outputs(%d) != Hsys outputs (%d)",pg,ph)); + endif + + [Gst, Gin, Gout, Gyd] = sysgetsignals(Gsys); + [Hst, Hin, Hout, Hyd] = sysgetsignals(Hsys); + + # check for digital to continuous addition + if (Gyd != Hyd) + error("can not add a discrete output to a continuous output"); + endif + + if( (Gsys.sys(1) == 0) | (Hsys.sys(1) == 0) ) + # see if adding transfer functions with identical denominators + Gsys = sysupdate(Gsys,"tf"); + Hsys = sysupdate(Hsys,"tf"); + if(Hsys.den == Gsys.den) + sys = Gsys; + sys.sys(1) = 0; + sys.num = sys.num + Hsys.num; + return + endif + endif + + # make sure in ss form + Gsys = sysupdate(Gsys,"ss"); + Hsys = sysupdate(Hsys,"ss"); + + sys = sysgroup(Gsys,Hsys); + + eyin = eye(mg); + eyout = eye(pg); + + + inname = Gin; + outname = Gout; + + sys = sysscale(sys,[eyout eyout],[eyin;eyin],outname,inname); + +endfunction