home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / octa21eb.zip / octave / SCRIPTS.ZIP / scripts.fat / control / syssub.m < prev    next >
Text File  |  1999-04-29  |  3KB  |  97 lines

  1. # Copyright (C) 1996 A. Scottedward Hodel 
  2. #
  3. # This file is part of Octave. 
  4. #
  5. # Octave is free software; you can redistribute it and/or modify it 
  6. # under the terms of the GNU General Public License as published by the 
  7. # Free Software Foundation; either version 2, or (at your option) any 
  8. # later version. 
  9. # Octave is distributed in the hope that it will be useful, but WITHOUT 
  10. # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 
  11. # FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License 
  12. # for more details.
  13. # You should have received a copy of the GNU General Public License 
  14. # along with Octave; see the file COPYING.  If not, write to the Free 
  15. # Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. 
  16.  
  17. function sys = syssub(Gsys,Hsys)
  18. # [sys] = syssub(Gsys,Hsys)
  19. #
  20. #
  21. # returns transfer functin sys = Gsys - Hsys
  22. #
  23. # Method: Gsys and Hsys are connected in parallel
  24. # The vector are connected to both systems; the outputs will be 
  25. # subtracted.  The names given to the system will be the G systems names.
  26. #
  27. #                  ________
  28. #             ----|  Gsys  |---
  29. #        u   |    ----------  +|         
  30. #        -----                (_)----> y
  31. #            |     ________   -|
  32. #             ----|  Hsys  |---
  33. #                  --------
  34.  
  35. # Written by John Ingram July 1996
  36.  
  37.   save_val = implicit_str_to_num_ok;    # save for later
  38.   implicit_str_to_num_ok = 1;
  39.  
  40.   if(nargin != 2)
  41.     usage("syssub:  [sys] = syssub(Gsys,Hsys)");
  42.   endif
  43.  
  44.   # check inputs
  45.   if(!is_struct(Gsys) | !is_struct(Hsys))
  46.     error("Both Gsys and Hsys must be a system data structure");
  47.   endif
  48.  
  49.   # check for compatibility
  50.   [n,nz,mg,pg] = sysdimen(Gsys);
  51.   [n,nz,mh,ph] = sysdimen(Hsys);
  52.   if(mg != mh)
  53.     error(sprintf("Gsys inputs(%d) != Hsys inputs (%d)",mg,mh));
  54.   elseif(pg != ph)
  55.     error(sprintf("Gsys outputs(%d) != Hsys outputs (%d)",pg,ph));
  56.   endif
  57.  
  58.   [Gst, Gin, Gout, Gyd] = sysgetsg(Gsys);
  59.   [Hst, Hin, Hout, Hyd] = sysgetsg(Hsys);
  60.  
  61.   # check for digital to continuous addition
  62.   if (Gyd != Hyd)
  63.     error("can not add a discrete output to a continuous output");
  64.   endif
  65.  
  66.   if( strcmp(sysgetty(Gsys),"tf") | strcmp(sysgetty(Hsys),"tf") )
  67.     # see if adding  transfer functions with identical denominators
  68.     [Gnum,Gden,GT,Gin,Gout] = sys2tf(Gsys);
  69.     [Hnum,Hden,HT,Hin,Hout] = sys2tf(Hsys);
  70.     if( (Hden == Gden) & (HT == GT) )
  71.       sys = tf2sys(Gnum-Hnum,Gden,GT,Gin,Gout);
  72.       return
  73.     endif
  74.     # if not, we go on and do the usual thing...
  75.   endif
  76.  
  77.   # make sure in ss form
  78.   Gsys = sysupdat(Gsys,"ss");
  79.   Hsys = sysupdat(Hsys,"ss");
  80.  
  81.   # change signal names to avoid warning messages from sysgroup
  82.   Gsys = syssetsg(Gsys,"in",sysdefio(length(Gin),"Gin_u"));
  83.   Gsys = syssetsg(Gsys,"out",sysdefio(length(Gout),"Gout_u"));
  84.   Hsys = syssetsg(Hsys,"in",sysdefio(length(Hin),"Hin_u"));
  85.   Hsys = syssetsg(Hsys,"out",sysdefio(length(Hout),"Hout_u"));
  86.   
  87.   sys = sysgroup(Gsys,Hsys);
  88.  
  89.   eyin = eye(mg); eyout = eye(pg);
  90.  
  91.   sys = sysscale(sys,[eyout -eyout],[eyin;eyin],Gout,Gin);
  92.  
  93. endfunction
  94.