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

  1. ## Copyright (C) 1996,1998 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{retsys} =} sysprune ( @var{Asys}, @var{out_idx}, @var{in_idx})
  21. ## Extract specified inputs/outputs from a system
  22. ## 
  23. ## @strong{Inputs}
  24. ## @table @var
  25. ## @item   Asys
  26. ## system data structure
  27. ## @item out_idx,in_idx
  28. ##  list of connections indices; the new
  29. ##        system has outputs y(out_idx(ii)) and inputs u(in_idx(ii)).
  30. ##        May select as [] (empty matrix) to specify all outputs/inputs.
  31. ## @end table
  32. ## 
  33. ## @strong{Outputs}
  34. ## @var{retsys}: resulting system
  35. ## @example
  36. ## @group
  37. ##            ____________________
  38. ## u1 ------->|                  |----> y1
  39. ##  (in_idx)  |       Asys       | (out_idx)
  40. ## u2 ------->|                  |----| y2
  41. ##   (deleted)-------------------- (deleted)   
  42. ## @end group
  43. ## @end example
  44. ## 
  45. ## @end deftypefn
  46. ## 
  47.  
  48. function sys = sysprune (sys, output_idx, input_idx, state_idx)
  49.  
  50.   ## A. S. Hodel August 1995
  51.   ## Updated by John Ingram 7-15-96
  52.  
  53.   if( nargin < 3 | nargin > 4  )
  54.     usage("retsys = sysprune(sys,output_idx,input_idx{,state_idx})");
  55.   elseif(nargin < 4)
  56.     state_idx = [];
  57.   endif
  58.  
  59.   ## default: no action
  60.   [nn,nz,mm,pp] = sysdimen(sys);
  61.   if(isempty(output_idx)) output_idx = 1:pp; endif
  62.   if(isempty(input_idx)) input_idx = 1:mm; endif
  63.   if(isempty(state_idx)) state_idx = 1:(nn+nz); endif
  64.  
  65.   ## check dimensions
  66.   if( !(is_vec(output_idx) | isempty(output_idx) )  )
  67.     if(!is_mat(output_idx)) 
  68.       error("sysprune: bad argument passed for output_idx");
  69.     else 
  70.       error("sysprune: output_idx (%d x %d) must be a vector or empty", ...
  71.         rows(output_idx),columns(output_idx));
  72.     endif
  73.   elseif(is_dupl(output_idx))
  74.      error("sysprune: duplicate entries found in output_idx");
  75.   endif
  76.  
  77.   if( !(is_vec(input_idx) | isempty(input_idx) )  )
  78.     if(!is_mat(input_idx)) 
  79.       error("sysprune: bad argument passed for input_idx");
  80.     else 
  81.       error("sysprune: input_idx (%d x %d) must be a vector or empty", ...
  82.         rows(input_idx),columns(input_idx));
  83.     endif
  84.   elseif(is_dupl(input_idx))
  85.      error("sysprune: duplicate entries found in input_idx");
  86.   endif
  87.  
  88.   if( !(is_vec(state_idx) | isempty(state_idx) )  )
  89.     if(!is_mat(state_idx)) 
  90.       error("sysprune: bad argument passed for state_idx");
  91.     else 
  92.       error("sysprune: state_idx (%d x %d) must be a vector or empty", ...
  93.         rows(state_idx),columns(state_idx));
  94.     endif
  95.   elseif(nn+nz > 0)
  96.     if(is_dupl(state_idx))
  97.       error("sysprune: duplicate entries found in state_idx");
  98.     endif
  99.   endif
  100.  
  101.   lo = length(output_idx);
  102.   li = length(input_idx);
  103.   lst = length(state_idx);
  104.   
  105.   if( !is_struct(sys))
  106.     error("Asys must be a system data structure (see ss2sys, tf2sys, or zp2sys)")
  107.   elseif(pp < lo)
  108.     error([num2str(lo)," output_idx entries, system has only ", ...
  109.     num2str(pp)," outputs"]);
  110.   elseif(mm < li)
  111.     error([num2str(li)," input_idx entries, system has only ", ...
  112.     num2str(mm)," inputs"]);
  113.   elseif(nn+nz < lst)
  114.     error([num2str(lst)," state_idx entries, system has only ", ...
  115.     num2str(nn+nz)," states"]);
  116.   endif
  117.  
  118.   [aa,bb,cc,dd,tsam,nn,nz,stnam,innam,outnam,yd] = sys2ss(sys);
  119.  
  120.   ## check for legal state permutation
  121.   if(nn & nz)
  122.     c_idx = find(state_idx <= nn);
  123.     if(!isempty(c_idx)) max_c = max(c_idx);
  124.     else            max_c = 0;            endif
  125.     d_idx = find(state_idx > nn);
  126.     if(!isempty(d_idx)) min_d = min(d_idx);
  127.     else            min_d = nn+nz;            endif
  128.     if(max_c > min_d)
  129.       warning("sysprune: state_idx(%d)=%d (discrete) preceeds", ...
  130.     min_d,state_idx(min_d));
  131.       warning("          state_idx(%d)=%d (continuous)",...
  132.     max_c,state_idx(max_c));
  133.       warning("sysprune: sys has %d continuous states, %d discrete states", ...
  134.     nn,nz);
  135.       error("continuous/discrete state partition not preserved ; see ss2sys");
  136.     endif
  137.   endif
  138.  
  139.   idx = input_idx;
  140.   odx = output_idx;
  141.   if(isempty(state_idx))
  142.     idx = [];
  143.     odx = [];
  144.   endif
  145.   aa = aa(state_idx,state_idx);
  146.   bb = bb(state_idx,idx);
  147.   cc = cc(odx,state_idx);
  148.   dd = dd(output_idx,input_idx);
  149.   yd = yd(output_idx); 
  150.  
  151.   innam  = innam(input_idx);
  152.   outnam = outnam(output_idx); 
  153.   stnam = stnam(state_idx);
  154.   nn1 = length(find(state_idx <= nn));
  155.   nz1 = length(find(state_idx > nn));
  156.   sys = ss2sys(aa,bb,cc,dd,tsam,nn1,nz1,stnam,innam,outnam,find(yd));
  157. endfunction
  158.