home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / octa21fb.zip / octave / SCRIPTS.ZIP / scripts.fat / control / ss2sys.m < prev    next >
Text File  |  1999-12-24  |  9KB  |  294 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{sys} =} ss2sys  (@var{a},@var{b},@var{c}@{,@var{d}, @var{tsam}, @var{n}, @var{nz}, @var{stname}, @var{inname}, @var{outname}, @var{outlist}@})
  21. ##  Create system structure from state-space data.   May be continous,
  22. ##  discrete, or mixed (sampeled-data)
  23. ## 
  24. ## @strong{Inputs}
  25. ## @table @var
  26. ## @item   a, b, c, d
  27. ##  usual state space matrices.
  28. ## 
  29. ##                default: @var{d} = zero matrix
  30. ## 
  31. ## @item   tsam
  32. ##  sampling rate.  Default: @math{tsam = 0} (continuous system)
  33. ## 
  34. ## @item  n, nz
  35. ##  number of continuous, discrete states in the system
  36. ## 
  37. ##         default:
  38. ## @table @var
  39. ## @item tsam = 0
  40. ## @math{n = @code{rows}(@var{a})}, @math{nz = 0}
  41. ## 
  42. ## @item tsam > 0
  43. ## @math{ n = 0},       @math{nz = @code{rows}(@var{a})}
  44. ## 
  45. ##         see below for system partitioning
  46. ## 
  47. ## @end table
  48. ## 
  49. ## @item  stname
  50. ##  list of strings of state signal names
  51. ## 
  52. ##            default (@var{stname}=[] on input): @code{x_n} for continuous states,
  53. ##                     @code{xd_n} for discrete states
  54. ## 
  55. ## @item inname
  56. ##  list of strings of input signal names
  57. ## 
  58. ##            default (@var{inname} = [] on input): @code{u_n}
  59. ## 
  60. ## @item outname
  61. ##  list of strings of input signal names
  62. ## 
  63. ##            default (@var{outname} = [] on input): @code{y_n}
  64. ## 
  65. ## @item   outlist
  66. ## 
  67. ##  list of indices of outputs y that are sampled
  68. ## 
  69. ##            default: 
  70. ## @table @var
  71. ## @item tsam = 0  
  72. ## @math{outlist = []}
  73. ## @item tsam > 0  
  74. ## @math{outlist = 1:@code{rows}(@var{c})}
  75. ## @end table
  76. ## 
  77. ## Unlike states, discrete/continous outputs may appear in any order.
  78. ## 
  79. ## @strong{Note} @code{sys2ss} returns a vector @var{yd} where
  80. ## @var{yd}(@var{outlist}) = 1; all other entries of @var{yd} are 0.
  81. ## 
  82. ## @end table
  83. ## 
  84. ## @strong{Outputs}
  85. ## @var{outsys} = system data structure
  86. ## 
  87. ## @strong{System partitioning}
  88. ## 
  89. ##  Suppose for simplicity that outlist specified
  90. ##   that the first several outputs were continuous and the remaining outputs
  91. ##   were discrete.  Then the system is partitioned as
  92. ## @example
  93. ## @group
  94. ## x = [ xc ]  (n x 1)
  95. ##     [ xd ]  (nz x 1 discrete states)
  96. ## a = [ acc acd ]  b = [ bc ]
  97. ##     [ adc add ]      [ bd ]
  98. ## c = [ ccc ccd ]  d = [ dc ]
  99. ##     [ cdc cdd ]      [ dd ]  
  100. ## 
  101. ##     (cdc = c(outlist,1:n), etc.)
  102. ## @end group
  103. ## @end example
  104. ## with dynamic equations:
  105. ## @ifinfo
  106. ## @math{  d/dt xc(t)     = acc*xc(t)      + acd*xd(k*tsam) + bc*u(t)}
  107. ## 
  108. ## @math{  xd((k+1)*tsam) = adc*xc(k*tsam) + add*xd(k*tsam) + bd*u(k*tsam)}
  109. ## 
  110. ## @math{  yc(t)      = ccc*xc(t)      + ccd*xd(k*tsam) + dc*u(t)}
  111. ## 
  112. ## @math{  yd(k*tsam) = cdc*xc(k*tsam) + cdd*xd(k*tsam) + dd*u(k*tsam)}
  113. ## @end ifinfo
  114. ## @iftex
  115. ## @tex
  116. ## $$\eqalign{
  117. ## {d \over dt} x_c(t)  
  118. ##   & =   a_{cc} x_c(t)      + a_{cd} x_d(k*t_{sam}) + bc*u(t) \cr
  119. ## x_d((k+1)*t_{sam}) 
  120. ##   & =   a_{dc} x_c(k t_{sam}) + a_{dd} x_d(k t_{sam}) + b_d u(k t_{sam}) \cr
  121. ## y_c(t)
  122. ##  & =  c_{cc} x_c(t) + c_{cd} x_d(k t_{sam}) + d_c u(t) \cr
  123. ## y_d(k t_{sam}) 
  124. ##   & =  c_{dc} x_c(k t_{sam}) + c_{dd} x_d(k t_{sam}) + d_d u(k t_{sam})
  125. ## }$$
  126. ## @end tex
  127. ## @end iftex
  128. ## 
  129. ## @strong{Signal partitions}
  130. ## @example
  131. ## @group
  132. ##         | continuous      | discrete               |
  133. ## ----------------------------------------------------
  134. ## states  | stname(1:n,:)   | stname((n+1):(n+nz),:) |
  135. ## ----------------------------------------------------
  136. ## outputs | outname(cout,:) | outname(outlist,:)     |
  137. ## ----------------------------------------------------
  138. ## @end group
  139. ## @end example
  140. ## where @math{cout} is the list of in 1:@code{rows}(@var{p}) 
  141. ## that are not contained in outlist. (Discrete/continuous outputs
  142. ## may be entered in any order desired by the user.)
  143. ## 
  144. ## @strong{Example}
  145. ## @example
  146. ## octave:1> a = [1 2 3; 4 5 6; 7 8 10]; 
  147. ## octave:2> b = [0 0 ; 0 1 ; 1 0];
  148. ## octave:3> c = eye(3);
  149. ## octave:4> sys = ss2sys(a,b,c,[],0,3,0,list("volts","amps","joules"));
  150. ## octave:5> sysout(sys);
  151. ## Input(s)
  152. ##         1: u_1
  153. ##         2: u_2
  154. ## 
  155. ## Output(s):
  156. ##         1: y_1
  157. ##         2: y_2
  158. ##         3: y_3
  159. ## 
  160. ## state-space form:
  161. ## 3 continuous states, 0 discrete states
  162. ## State(s):
  163. ##         1: volts
  164. ##         2: amps
  165. ##         3: joules
  166. ## 
  167. ## A matrix: 3 x 3
  168. ##    1   2   3
  169. ##    4   5   6
  170. ##    7   8  10
  171. ## B matrix: 3 x 2
  172. ##   0  0
  173. ##   0  1
  174. ##   1  0
  175. ## C matrix: 3 x 3
  176. ##   1  0  0
  177. ##   0  1  0
  178. ##   0  0  1
  179. ## D matrix: 3 x 3
  180. ##   0  0
  181. ##   0  0
  182. ##   0  0
  183. ## @end example
  184. ## Notice that the @var{D} matrix is constructed  by default to the 
  185. ## correct dimensions.  Default input and output signals names were assigned
  186. ## since none were given.
  187. ## 
  188. ## @end deftypefn
  189.  
  190. function  retsys = ss2sys (a, b, c, d, tsam, n, nz, stname, inname, outname, outlist)
  191.  
  192.   ## Written by John Ingram (ingraje@eng.auburn.edu)  July 20, 1996
  193.  
  194.   ## Test for correct number of inputs
  195.   if ((nargin < 3) | (nargin > 11))
  196.     usage("retsys = ss2sys  (a,b,c{,d,tsam,n,nz,stname,inname,outname,outlist})");
  197.   endif
  198.  
  199.   ## verify A, B, C, D arguments
  200.   ## If D is not specified, set it to a zero matrix of appriate dimension.
  201.   if (nargin == 3)          d = zeros(rows(c) , columns(b));
  202.   elseif (isempty(d))       d = zeros(rows(c) , columns(b));      endif
  203.  
  204.   ## Check the dimensions
  205.   [na,m,p] = abcddim(a,b,c,d);
  206.  
  207.   ## If dimensions are wrong, exit function
  208.   if (m == -1)
  209.     error("a(%dx%d), b(%dx%d), c(%dx%d), d(%dx%d); incompatible", ...
  210.       rows(a), columns(a), rows(b), columns(b), rows(c), columns(c), ...
  211.       rows(d), columns(d));
  212.   endif
  213.  
  214.   ## check for tsam input
  215.   if(nargin < 5) tsam = 0;
  216.   elseif( !( is_sampl(tsam) | (tsam == 0) ) )
  217.     error("tsam must be a nonnegative real scalar");
  218.   endif
  219.  
  220.   ## check for continuous states
  221.   if( (nargin < 6) & (tsam == 0) )               n = na;
  222.   elseif(nargin < 6)                             n = 0;
  223.   elseif((!is_mat(n)) | isstr(n))
  224.     error("Parameter n is not a numerical value.");
  225.   elseif( (!is_scal(n)) | (n < 0 ) | (n != round(n)) )
  226.     if(is_scal(n))     error("illegal value of n=%d,%e",n,n);
  227.     else                 error("illegal value of n=(%dx%d)", ...
  228.                rows(n), columns(n));        endif
  229.   endif
  230.  
  231.   ## check for num discrete states
  232.   if( (nargin < 7) & (tsam == 0))         nz = 0;
  233.   elseif(nargin < 7)                nz = na - n;
  234.   elseif((!is_mat(nz)) | isstr(nz))
  235.     error("Parameter nz is not a numerical value.");
  236.   elseif( (!is_scal(nz)) | (nz < 0 ) | (nz != round(nz)) )
  237.     if(is_scal(nz))
  238.       error(["illegal value of nz=",num2str(nz)]);
  239.     else
  240.       error(["illegal value of nz=(",num2str(rows(nz)),"x", ...
  241.     num2str(columns(nz)),")"]);
  242.     endif
  243.   endif
  244.  
  245.   ## check for total number of states
  246.   if( (n + nz) != na )
  247.     error(["Illegal: a is ",num2str(na),"x",num2str(na),", n=", ...
  248.     num2str(n),", nz=",num2str(nz)]);
  249.   endif
  250.  
  251.   ## construct system with default names
  252.   retsys.a = a;
  253.   retsys.b = b; 
  254.   retsys.c = c; 
  255.   retsys.d = d;
  256.  
  257.   retsys.n = n;
  258.   retsys.nz = nz;
  259.   retsys.tsam = tsam;
  260.   retsys.yd = zeros(1,p);     # default value entered below
  261.  
  262.   ## Set the system vector:  active = 2(ss), updated = [0 0 1];
  263.   retsys.sys = [2, 0, 0, 1]; 
  264.  
  265.   retsys.stname = sysdefst(n,nz);
  266.   retsys.inname = sysdefio(m,"u");
  267.   retsys.outname = sysdefio(p,"y");
  268.  
  269.   ## check for state names
  270.   if(nargin >= 8)
  271.     if(!isempty(stname)) retsys = syssetsg(retsys,"st",stname); endif
  272.   endif
  273.  
  274.   ## check for input names
  275.   if(nargin >= 9)
  276.     if(!isempty(inname)) retsys = syssetsg(retsys,"in",inname); endif
  277.   endif
  278.  
  279.   ## check for output names
  280.   if(nargin >= 10)
  281.     if(!isempty(outname)) retsys = syssetsg(retsys,"out",outname); endif
  282.   endif
  283.  
  284.   ## set up yd
  285.   if(nargin < 11)
  286.     retsys = syssetsg(retsys,"yd",ones(1,p)*(tsam > 0));
  287.   else
  288.     if(!isempty(outlist)) 
  289.       retsys = syssetsg(retsys,"yd",ones(size(outlist)),outlist);
  290.     endif
  291.   endif
  292.  
  293. endfunction
  294.