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

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