Mercurial > hg > octave-nkf
diff scripts/control/sysdup.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/sysdup.m @@ -0,0 +1,136 @@ +# 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 retsys = sysdup(Asys,output_list,input_list) +# function retsys = sysdup(Asys,output_list,input_list) +# Duplicate specified input/output connections of a system +# +# +# inputs: +# Asys: system data structure (see ss2sys) +# output_list,input_list: list of connections indices; +# duplicates are made of y(output_list(ii)) and u(input_list(ii)). +# output: retsys: resulting closed loop system: +# duplicated i/o names are appended with a "+" suffix. +# +# Operation: sysdup creates copies of selected inputs and outputs as +# shown below. u1/y1 is the set of original inputs/outputs, and +# u2,y2 is the set of duplicated inputs/outputs in the order specified +# in input_list,output_list, respectively +# ____________________ +# | | +# u1 ----->| |----> y1 +# | Asys | +# | | +# u2 ------------->| |----->y2 +# (input_list) | | (output_list) +# -------------------- + +# A. S. Hodel August 1995 +# modified 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 != 3) + usage("retsys = sysdup(Asys,output_list,input_list)"); + endif + + if( !is_struct(Asys)) + error("Asys must be a system data structure (see ss2sys, tf2sys, or zp2sys)") + endif + + if (Asys.sys(4) != 1) + Asys = sysupdate(Asys,'ss'); + endif + + mm = rows(Asys.inname); + pp = rows(Asys.outname); + + # first duplicate inputs + if(is_vector(input_list)) + for ii=1:length(input_list); + Asys.b(:,mm+ii) = Asys.b(:,input_list(ii)); + Asys.d(:,mm+ii) = Asys.d(:,input_list(ii)); + end + elseif(!isempty(input_list)) + error("input_list must be a vector or empty"); + endif + + + # now duplicate outputs + osize = min(size(output_list)); + if(osize == 1) + for ii=1:length(output_list); + Asys.c(pp+ii,:) = Asys.c(output_list(ii),:); + Asys.d(pp+ii,:) = Asys.d(output_list(ii),:); + end + elseif(osize != 0) + error("output_list must be a vector or empty"); + endif + + yd = Asys.yd(output_list); + Asys.yd = [Asys.yd yd]; + + # give default names to the added inputs + for ii=(mm+1):(mm+length(input_list)) + orig_name = Asys.inname(input_list(ii-mm),:); + + #disp("sysdup: orig_name=") + #orig_name + #disp("/sysdup") + + strval = [dezero(orig_name),"(dup)"]; + + #disp("sysdup: strval=") + #strval + #disp("/sysdup") + + Asys.inname(ii,1:length(strval)) = [strval]; + + #disp("sysdup: resulting Asys.inname:") + #Asys.inname + #disp("/sysdup"); + + endfor + + # give default names to the added outputs + for jj=(pp+1):(pp+length(output_list)) + if(isstr(Asys.outname)) + orig_name =Asys.outname; + else + orig_name = Asys.outname(output_list(jj-pp),:); + endif + strval = [dezero(orig_name),"(dup)"]; + Asys.outname(jj,1:length(strval)) = [strval]; + + endfor + + + + if(max(size(Asys.d)) > 1 ) + Asys.sys = [2 0 0 1]; # change default form to state space + # tf and zp are no longer relevant + endif + + retsys = Asys; + + implicit_str_to_num_ok = save_val; # restore value + +endfunction