home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / octa21fb.zip / octave / SCRIPTS.ZIP / scripts.fat / control / sysapp.m < prev    next >
Text File  |  1999-12-24  |  6KB  |  192 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} =} sysapp (@var{sys},@var{b}@{, @var{c}, @var{d}, @var{outname}, @var{inname}, @var{yd}@})
  21. ## appends new inputs and/or outputs to a system
  22. ## 
  23. ## @strong{Inputs}
  24. ## @table @var
  25. ## @item sys
  26. ## system data structure
  27. ## 
  28. ## @item b
  29. ## matrix to be appended to sys "B" matrix (empty if none)
  30. ## 
  31. ## @item c
  32. ## matrix to be appended to sys "C" matrix (empty if none)
  33. ## 
  34. ## @item d
  35. ## revised sys d matrix (can be passed as [] if the revised d is all zeros)
  36. ## 
  37. ## @item outname
  38. ## list of names for new outputs
  39. ## 
  40. ## @item inname
  41. ## list of names for new inputs
  42. ## 
  43. ## @item yd
  44. ## binary vector; @math{yd(ii)=0} indicates a continuous output;
  45. ## @math{yd(ii)=1} indicates a discrete output.
  46. ## @end table
  47. ## 
  48. ## @strong{Outputs} @var{sys}
  49. ## @example
  50. ## @group
  51. ##    sys.b := [sys.b , b]
  52. ##    sys.c := [sys.c  ]
  53. ##             [ c     ]
  54. ##    sys.d := [sys.d | D12 ]
  55. ##             [D21   | D22 ]
  56. ## @end group
  57. ## @end example
  58. ## where @var{D12}, @var{D21}, and @var{D22} are the appropriate dimensioned 
  59. ## blocks of the input parameter @var{d}.  
  60. ## @itemize @bullet
  61. ## @item The leading block @var{D11} of @var{d} is ignored.
  62. ## @item If @var{inname} and @var{outname} are not given as arguments, 
  63. ##     the new inputs and outputs are be assigned default names.  
  64. ## @item @var{yd} is a binary vector of length rows(c) that indicates
  65. ##     continuous/sampled outputs.  Default value for @var{yd} is:
  66. ## 
  67. ## @item @var{sys} = continuous or mixed
  68. ## @var{yd} = @code{zeros(1,rows(c))}
  69. ## 
  70. ## @item @var{sys} = discrete
  71. ## @var{yd} = @code{ones(1,rows(c))}
  72. ## 
  73. ## @end itemize
  74. ## 
  75. ## @end deftypefn
  76.  
  77. function retsys = sysapp (sys, b, c, d, outname, inname, yd)
  78.  
  79.   ## written by John Ingram August 1996
  80.   
  81.   sav_empty_list_elements_ok = empty_list_elements_ok;
  82.  
  83.   empty_list_elements_ok = 1;
  84.   
  85.   ## check input arguments
  86.   if ( (nargin < 2) | (nargin > 7) | (!is_struct(sys)))
  87.     usage("retsys = sysapp(sys,b,c[,d,outname,inname,yd]) ");
  88.   elseif(!is_struct(sys))
  89.     error("sys must be a system data structure");
  90.   endif
  91.   
  92.   ## default system type must be state space form
  93.   [Aa,Ab,Ac,Ad,Ats,Ann,Anz,Ast,Ain,Aout,Ayd] = sys2ss(sys);
  94.   [Ann,Anz,Am,Ap] = sysdimen(sys);
  95.  
  96.   ## default c
  97.   if(nargin < 3)      c = [];                                endif
  98.   
  99.   ## default d
  100.   if(nargin < 4)     make_d = 1;
  101.   elseif(isempty(d)) make_d = 1;
  102.   else               make_d = 0;                             endif
  103.   if(make_d)         d = zeros(rows(c)+Ap,columns(b) + Am);  endif
  104.  
  105.   ## Append new input(s) if any
  106.   Bm = max(columns(d),columns(b)+Am);
  107.   if(Bm != Am)    
  108.     ## construct new signal names
  109.     if(nargin >= 6)   # new names were passed
  110.       if(!isstr(inname))
  111.         error("inname must be a string");
  112.       elseif(rows(inname) != (Bm - Am))
  113.         error(sprintf("%d new inputs requested; inname(%dx%d)", ...
  114.       (Bm-Am),rows(inname),columns(inname)));
  115.       endif
  116.     else
  117.       inname = sysdefio(Bm,"u",(Am+1));
  118.     endif
  119.     if(Am)   Ain = append(Ain,inname);
  120.     else     Ain = inname;        endif
  121.  
  122.     ## default b matrix
  123.     if(isempty(b))     b  = zeros(Ann+Anz,(Bm-Am));          
  124.     elseif(rows(b) != Ann+Anz | columns(b) != (Bm-Am))
  125.         error(sprintf("b(%dx%d); should be (%dx%d)", rows(b), columns(b), ...
  126.           (Ann+Anz), (Bm-Am)));
  127.     endif
  128.  
  129.     ## append new b matrix
  130.     Ab = [Ab,b];    # empty_list_elements_ok=1 makes this ok
  131.   endif
  132.  
  133.   ## Append new output(s) if any
  134.   Bp = max(rows(d),rows(c)+Ap);
  135.   if(Bp != Ap)  
  136.  
  137.     ## construct new signal names, output classification
  138.     if(nargin >= 5)  # new names were passed
  139.       if(!isstr(outname))
  140.         error("outname must be a string");
  141.       elseif(rows(outname) != (Bp - Ap))
  142.         error(sprintf("%d new outputs requested; outname(%dx%d)", ...
  143.           (Bp-Ap),rows(outname),columns(outname)));
  144.       endif
  145.     else
  146.       outname = sysdefio(Bp,"y",(Ap+1));
  147.     endif
  148.     if(Ap)   Aout = append(Aout,outname);
  149.     else     Aout = outname;                endif
  150.  
  151.     ## construct new yd entries
  152.     if(nargin == 7)
  153.       if(!is_vec(yd))
  154.         error(sprintf("yd(%dx%d) must be a vector",rows(yd),columns(yd)))
  155.       elseif(rows(c) != length(yd) & rows(d) != length(yd))
  156.         error(sprintf("length(yd) = %d; c(%dx%d), d(%dx%d); mismatch", ...
  157.       length(yd), rows(c), columns(c),rows(d),columns(d)));
  158.       endif
  159.     else
  160.       ## default yd values
  161.       yd = ones(1,Bp)*( (Ats > 0) & (Ann == 0)  & isempty(find(Ayd == 0)) ) ;
  162.     endif
  163.     Ayd = [vec(Ayd);vec(yd)];
  164.  
  165.     ## default c matrix
  166.     if(isempty(c))      c = zeros((Bp-Ap),Ann+Anz);          
  167.     elseif(columns(c) != Ann+Anz | rows(c) != (Bp-Ap))
  168.         error(sprintf("c(%dx%d); should be (%dx%d)", rows(c), columns(c), ...
  169.           (Bp-Ap), (Ann+Anz) ));
  170.     endif
  171.  
  172.     ## append new c matrix
  173.     Ac = [Ac;c];    # empty_list_elements_ok=1 makes this ok
  174.   endif
  175.  
  176.   ## check d matrix
  177.   if(isempty(d)) d = zeros(Bp,Bm);
  178.   elseif(rows(d) != Bp | columns(d) != Bm)
  179.     error(sprintf("d(%dx%d) should be (%dx%d)",rows(d), columns(d), Bp, Bp));
  180.   endif
  181.  
  182.   ## Splice in original D matrix  
  183.   if(Am & Ap)          d(1:Ap, 1:Am) = Ad;       endif
  184.   Ad = d;
  185.   
  186.   ## construct return system
  187.   retsys = ss2sys(Aa,Ab,Ac,Ad,Ats,Ann,Anz,Ast,Ain,Aout,find(Ayd == 1));
  188.   
  189.   empty_list_elements_ok = sav_empty_list_elements_ok;
  190.  
  191. endfunction
  192.