home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / octa21fb.zip / octave / SCRIPTS.ZIP / scripts.fat / control / syssetsg.m < prev    next >
Text File  |  1999-12-24  |  7KB  |  229 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} =} syssetsg (@var{sys}, @var{opt}, @var{names}@{, @var{sig_idx}@})
  21. ##  change the names of selected inputs, outputs and states.
  22. ## @strong{Inputs}
  23. ## @table @var
  24. ## @item sys
  25. ##  system data structure
  26. ## 
  27. ## @item opt
  28. ## change default name (output)
  29. ## 
  30. ## @table @code
  31. ## @item "out"
  32. ##  change selected output names
  33. ## @item "in"
  34. ##  change selected input names
  35. ## @item "st"
  36. ##  change selected state names   
  37. ## @item "yd"
  38. ##  change selected outputs from discrete to continuous or 
  39. ##                    from continuous to discrete.
  40. ## @end table
  41. ## 
  42. ## @item names
  43. ## @table @code
  44. ## @item opt = "out", "in", or "st"
  45. ##  string or string array containing desired signal names or values.
  46. ## @item opt = "yd"
  47. ## To desired output continuous/discrete flag.
  48. ## Set name to 0 for continuous, or 1 for discrete.
  49. ## @end table
  50. ## @item list
  51. ##  vector of indices of outputs, yd, inputs, or
  52. ##              states whose respective names should be changed.
  53. ## 
  54. ##              Default: replace entire list of names/entire yd vector.
  55. ## @end table
  56. ## @strong{Outputs}
  57. ##     @var{retsys=sys} with appropriate signal names changed 
  58. ##             (or yd values, where appropriate)
  59. ## 
  60. ## 
  61. ## @strong{Example}
  62. ## @example
  63. ## octave:1> sys=ss2sys([1 2; 3 4],[5;6],[7 8]);
  64. ## octave:2> sys = syssetsg(sys,"st",str2mat("Posx","Velx"));
  65. ## octave:3> sysout(sys)
  66. ## Input(s)
  67. ##         1: u_1
  68. ## Output(s):
  69. ##         1: y_1
  70. ## state-space form:
  71. ## 2 continuous states, 0 discrete states
  72. ## State(s):
  73. ##         1: Posx
  74. ##         2: Velx
  75. ## A matrix: 2 x 2
  76. ##   1  2
  77. ##   3  4
  78. ## B matrix: 2 x 1
  79. ##   5
  80. ##   6
  81. ## C matrix: 1 x 2
  82. ##   7  8
  83. ## D matrix: 1 x 1
  84. ## 0
  85. ## @end example
  86. ## 
  87. ## @end deftypefn
  88.  
  89. function retsys = syssetsg (sys, opt, names, sig_idx)
  90.  
  91.   ## Written by John Ingram August 1996
  92.  
  93.   if (nargin < 3 | nargin > 4)
  94.     usage("retsys=syssetsg(sys,opt,names{,sig_idx})");
  95.   elseif (!is_struct(sys))
  96.     error("sys must be a system data structure");
  97.   elseif (isempty(opt))
  98.     opt = "out";
  99.   elseif( ! isstr(opt)  )
  100.     error("opt must be a string");
  101.   elseif( ! (strcmp(opt,"out") + strcmp(opt,"yd") + ...
  102.     strcmp(opt,"in") + strcmp(opt,"st") ) )
  103.     error("opt must be one of [], ""out"", ""yd"", ""in"", or ""st""");
  104.   elseif(nargin == 4)
  105.     if(min(size(sig_idx)) > 1)
  106.       disp("syssetsg: sig_idx=")
  107.       disp(sig_idx);
  108.       error("sig_idx must be a vector")
  109.     endif
  110.   endif
  111.  
  112.   sig_vals = sysgetsg(sys,opt);
  113.  
  114.   ## make sure it's in state space form if state names are given
  115.   if(strcmp(opt,"st"))    sys = sysupdat(sys,"ss");    endif
  116.  
  117.   if(strcmp(opt,"yd") == 0)
  118.     ## it's a signal name list we're changing
  119.     if(!is_list(names))
  120.       names = list(names);
  121.     endif
  122.     if(!is_siglt(names))
  123.       if(isstr(nth(names,1)))
  124.         warning("syssetsg(opt=%s): converting string matrix \"names\" to a list of strings",opt);
  125.         tmpstr = nth(names,1);
  126.         for ii=1:rows(tmpstr)
  127.           names(ii) = deblank(tmpstr(ii,:));
  128.         endfor
  129.       else
  130.         names
  131.         error("parameter \"names\" must be a list of strings");
  132.       endif
  133.     endif
  134.     nsigs = length(sig_vals);
  135.  
  136.     if(nargin == 3)
  137.       ## replace all signal names
  138.       if(length(names) != nsigs)
  139.         error("opt=%s, sig_idx omitted: names(len=%d) should have %d entries ", ...
  140.           opt,length(names),nsigs);
  141.       endif
  142.       sig_idx = 1:nsigs;
  143.     elseif(length(names) != length(sig_idx))
  144.       ## replace specified signal names
  145.       error("opt=%s, sig_idx(len=%d), names(len=%d) mismatch",opt, ...
  146.         length(sig_idx), length(names));
  147.     endif
  148.  
  149.     for ii=1:length(sig_idx)
  150.       jj = sig_idx(ii);
  151.       if(jj < 1 | jj > nsigs | jj != floor(jj+0.5))
  152.         error("opt=%s, sig_idx(%d)=%d, %e: must be an integer between 1 and %d", ...
  153.           opt, ii, jj, jj, nsigs);
  154.       endif
  155.       sig_vals(jj) = nth(names,ii);
  156.     endfor
  157.  
  158.   else
  159.     ## update yd
  160.     ## 1st check pathological case: no outputs
  161.     nout = sysdimen(sys,"out");
  162.     if(nout == 0)
  163.       if(nargin != 3)
  164.         error("opt=%s, %d outputs, sysgetsg cannot take 4 arguments", ...
  165.           yd,nout);
  166.       endif
  167.       if(!isempty(names))
  168.         error("opt=%s, %d outputs, names is not empty");
  169.       endif
  170.       sigvals = [];
  171.     else
  172.       nsigs = length(sig_vals);
  173.       if(!is_vec(names))
  174.         error("syssetsg: opt=yd, names(%dx%d) must be a vector", ...
  175.           rows(names), columns(names));
  176.       endif
  177.       if(nargin == 3)
  178.         if(length(names) != nsigs)
  179.           error("opt=yd, sig_idx omitted: names(%d) should be length(%d)", ...
  180.             length(names), nsigs);
  181.         endif
  182.         sig_idx = 1:nsigs;
  183.       elseif(length(names) != length(sig_idx))
  184.         error("opt=yd: length(names)=%d, length(sig_idx)=%d",length(names), ...
  185.           length(sig_idx) );
  186.       endif
  187.   
  188.       badidx = find(names != 0 & names != 1);
  189.       if(! isempty(badidx) )
  190.         for ii=1:length(badidx)
  191.           warning("syssetsg: opt=yd: names(%d)=%e, must be 0 or 1", ...
  192.             badidx(ii), names(badidx(ii)) );
  193.         endfor
  194.         error("opt=yd: illegal values in names");
  195.       endif
  196.   
  197.       for ii=1:length(sig_idx)
  198.         jj = sig_idx(ii);
  199.         if(jj < 1 | jj > nsigs | jj != floor(jj))
  200.           error("sig_idx(%d)=%d, %e: must be an integer between 1 and %d", ...
  201.             ii,jj, jj, nsigs);
  202.         endif
  203.         sig_vals(jj) = names(ii);
  204.       endfor
  205.       if(any(sig_vals == 1) & sysgetts(sys) == 0)
  206.         warning("Setting system sampling time to 1");
  207.         printf("syssetsg: original system sampling time=0 but output(s)\n");
  208.         disp(find(sig_vals==1))
  209.         printf("are digital\n");
  210.         sys = syschtsa(sys,1);
  211.       endif
  212.       
  213.     endif
  214.   endif
  215.  
  216.   if(strcmp(opt,"st"))
  217.     sys.stname = sig_vals;
  218.   elseif(strcmp(opt,"in"))
  219.     sys.inname = sig_vals;
  220.   elseif(strcmp(opt,"out"))
  221.     sys.outname = sig_vals;
  222.   elseif(strcmp(opt,"yd"))
  223.     sys.yd = sig_vals;
  224.   endif
  225.  
  226.   retsys = sys;
  227.  
  228. endfunction
  229.