home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / octa21fb.zip / octave / SCRIPTS.ZIP / scripts.fat / control / syssub.m < prev    next >
Text File  |  1999-12-24  |  4KB  |  114 lines

  1. ## Copyright (C) 1996,1999 Auburn University.  All Rights Reserved
  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. ## 
  10. ## Octave is distributed in the hope that it will be useful, but WITHOUT 
  11. ## ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 
  12. ## FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License 
  13. ## for more details.
  14. ## 
  15. ## You should have received a copy of the GNU General Public License 
  16. ## along with Octave; see the file COPYING.  If not, write to the Free 
  17. ## Software Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA. 
  18.  
  19. ## -*- texinfo -*-
  20. ## @deftypefn {Function File } { @var{sys} =} syssub (@var{Gsys}, @var{Hsys})
  21. ##  returns @math{sys = Gsys - Hsys}
  22. ## 
  23. ##  Method: @var{Gsys} and @var{Hsys} are connected in parallel
  24. ##  The input vector is connected to both systems; the outputs are
  25. ##  subtracted.  Returned system names are those of @var{Gsys}.
  26. ## @example
  27. ## @group
  28. ##           ________
  29. ##      ----|  Gsys  |---
  30. ## u   |    ----------  +|         
  31. ## -----                (_)----> y
  32. ##     |     ________   -|
  33. ##      ----|  Hsys  |---
  34. ##           --------
  35. ## @end group
  36. ## @end example
  37. ## @end deftypefn
  38.  
  39. function sys = syssub (...)
  40.  
  41.   ## Written by John Ingram July 1996
  42.   ## updated for variable numbers of input arguments by July 1999 A. S. Hodel
  43.  
  44.   if(nargin < 1)
  45.     usage("syssub: sys = syssub(Gsys{,Hsys,...})");
  46.   endif
  47.  
  48.   ## collect all arguments
  49.   arglist = list();
  50.   va_start();
  51.   for kk=1:nargin
  52.     arglist(kk) = va_arg();
  53.     if(!is_struct(nth(arglist,kk)))
  54.       error("syssub: argument %d is not a data structure",kk);
  55.     endif
  56.   endfor           
  57.  
  58.   ## check system dimensions
  59.   [n,nz,mg,pg,Gyd] = sysdimen(nth(arglist,1));
  60.   for kk=2:nargin
  61.     [n,nz,mh,ph,Hyd] = sysdimen(nth(arglist,kk));
  62.     if(mg != mh)
  63.       error("arg 1 has %d inputs; arg %d has vs %d inputs",mg,kk,mh);
  64.     elseif(pg != ph)
  65.       error("arg 1 has %d outputs; arg %d has vs %d outputs",pg,kk,ph);
  66.     elseif(norm(Gyd - Hyd))
  67.       warning("cannot add a discrete output to a continuous output");
  68.       error("Output type mismatch: arguments 1 and %d\n",kk);
  69.     endif
  70.   endfor
  71.  
  72.   ## perform the subtract
  73.   if(nargin == 2)
  74.     Gsys = nth(arglist,1);   Hsys = nth(arglist,2);
  75.     if( strcmp(sysgetty(Gsys),"tf") | strcmp(sysgetty(Hsys),"tf") )
  76.       ## see if subtracting  transfer functions with identical denominators
  77.       [Gnum,Gden,GT,Gin,Gout] = sys2tf(Gsys);
  78.       [Hnum,Hden,HT,Hin,Hout] = sys2tf(Hsys);
  79.       if(length(Hden) == length(Gden) )
  80.         if( (Hden == Gden) & (HT == GT) )
  81.           sys = tf2sys(Gnum+Hnum,Gden,GT,Gin,Gout);
  82.           return
  83.         endif
  84.         ## if not, we go on and do the usual thing...
  85.       endif
  86.     endif
  87.   
  88.     ## make sure in ss form
  89.     Gsys = sysupdat(Gsys,"ss");
  90.     Hsys = sysupdat(Hsys,"ss");
  91.   
  92.     ## change signal names to avoid warning messages from sysgroup
  93.     Gsys = syssetsg(Gsys,"in",sysdefio(length(Gin),"Gin_u"));
  94.     Gsys = syssetsg(Gsys,"out",sysdefio(length(Gout),"Gout_u"));
  95.     Hsys = syssetsg(Hsys,"in",sysdefio(length(Hin),"Hin_u"));
  96.     Hsys = syssetsg(Hsys,"out",sysdefio(length(Hout),"Hout_u"));
  97.     
  98.     sys = sysgroup(Gsys,Hsys);
  99.   
  100.     eyin = eye(mg);
  101.     eyout = eye(pg);
  102.   
  103.     sys = sysscale (sys, [eyout, -eyout], [eyin; eyin], Gout, Gin);
  104.   
  105.   else
  106.     ## multiple systems (or a single system); combine together one by one
  107.     sys = nth(arglist,1);
  108.     for kk=2:length(arglist)
  109.       sys = syssub(sys,nth(arglist,kk));
  110.     endfor
  111.   endif
  112.   
  113. endfunction
  114.