]> Creatis software - CreaPhase.git/blobdiff - octave_packages/control-2.3.52/@ss/ss.m
Add a useful package (from Source forge) for octave
[CreaPhase.git] / octave_packages / control-2.3.52 / @ss / ss.m
diff --git a/octave_packages/control-2.3.52/@ss/ss.m b/octave_packages/control-2.3.52/@ss/ss.m
new file mode 100644 (file)
index 0000000..72a038b
--- /dev/null
@@ -0,0 +1,151 @@
+## Copyright (C) 2009, 2010   Lukas F. Reichlin
+##
+## This file is part of LTI Syncope.
+##
+## LTI Syncope is free software: you can redistribute it and/or modify
+## it under the terms of the GNU General Public License as published by
+## the Free Software Foundation, either version 3 of the License, or
+## (at your option) any later version.
+##
+## LTI Syncope is distributed in the hope that it will be useful,
+## but WITHOUT ANY WARRANTY; without even the implied warranty of
+## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+## GNU General Public License for more details.
+##
+## You should have received a copy of the GNU General Public License
+## along with LTI Syncope.  If not, see <http://www.gnu.org/licenses/>.
+
+## -*- texinfo -*-
+## @deftypefn {Function File} {@var{sys} =} ss (@var{sys})
+## @deftypefnx {Function File} {@var{sys} =} ss (@var{d})
+## @deftypefnx {Function File} {@var{sys} =} ss (@var{a}, @var{b})
+## @deftypefnx {Function File} {@var{sys} =} ss (@var{a}, @var{b}, @var{c})
+## @deftypefnx {Function File} {@var{sys} =} ss (@var{a}, @var{b}, @var{c}, @var{d}, @dots{})
+## @deftypefnx {Function File} {@var{sys} =} ss (@var{a}, @var{b}, @var{c}, @var{d}, @var{tsam}, @dots{})
+## Create or convert to state-space model.
+##
+## @strong{Inputs}
+## @table @var
+## @item sys
+## LTI model to be converted to state-space.
+## @item a
+## State transition matrix (n-by-n).
+## @item b
+## Input matrix (n-by-m).
+## @item c
+## Measurement matrix (p-by-n).
+## If @var{c} is empty @code{[]} or not specified, an identity matrix is assumed.
+## @item d
+## Feedthrough matrix (p-by-m).
+## If @var{d} is empty @code{[]} or not specified, a zero matrix is assumed.
+## @item tsam
+## Sampling time in seconds.  If @var{tsam} is not specified, a continuous-time model is assumed.
+## @item @dots{}
+## Optional pairs of properties and values.
+## Type @command{set (ss)} for more information.
+## @end table
+##
+## @strong{Outputs}
+## @table @var
+## @item sys
+## State-space model.
+## @end table
+##
+## @strong{Example}
+## @example
+## @group
+## octave:1> a = [1 2 3; 4 5 6; 7 8 9];
+## octave:2> b = [10; 11; 12];
+## octave:3> stname = @{"V", "A", "kJ"@};
+## octave:4> sys = ss (a, b, [], [], "stname", stname)
+## 
+## sys.a =
+##         V   A  kJ
+##    V    1   2   3
+##    A    4   5   6
+##    kJ   7   8   9
+## 
+## sys.b =
+##        u1
+##    V   10
+##    A   11
+##    kJ  12
+## 
+## sys.c =
+##         V   A  kJ
+##    y1   1   0   0
+##    y2   0   1   0
+##    y3   0   0   1
+## 
+## sys.d =
+##        u1
+##    y1   0
+##    y2   0
+##    y3   0
+## 
+## Continuous-time model.
+## octave:5> 
+## @end group
+## @end example
+##
+## @seealso{tf, dss}
+## @end deftypefn
+
+## Author: Lukas Reichlin <lukas.reichlin@gmail.com>
+## Created: September 2009
+## Version: 0.3
+
+function sys = ss (a = [], b = [], c = [], d = [], varargin)
+
+  ## model precedence: frd > ss > zpk > tf > double
+  ## inferiorto ("frd");
+  superiorto ("zpk", "tf", "double");
+
+  argc = 0;                             # initialize argument count
+  tsam = 0;                             # initialize sampling time
+
+  if (nargin == 1)
+    if (isa (a, "ss"))                  # already in ss form  sys = ss (sssys)
+      sys = a;
+      return;
+    elseif (isa (a, "lti"))             # another lti object  sys = ss (sys)
+      [sys, alti] = __sys2ss__ (a);
+      sys.lti = alti;                   # preserve lti properties
+      return;
+    elseif (is_real_matrix (a))         # static gain  sys = ss (5), sys = ss (matrix)
+      d = a;
+      a = [];
+    else
+      print_usage ();
+    endif
+  elseif (nargin > 4)                   # default case  sys = ss (a, b, c, d, "prop1", val1, ...)
+    argc = numel (varargin);            # number of additional arguments after d
+    if (issample (varargin{1}, -10))    # sys = ss (a, b, c, d, tsam, "prop1, "val1", ...)
+      tsam = varargin{1};               # sampling time, could be 0 as well
+      argc--;                           # tsam is not a property-value pair
+      if (argc > 0)                     # if there are any properties and values ...
+        varargin = varargin(2:end);     # remove tsam from property-value list
+      endif
+    endif
+  endif                                 # nothing to do for ss (), ss (a, b), ss (a, b, c), ss (a, b, c, d)
+
+  [a, b, c, d, tsam] = __adjust_ss_data__ (a, b, c, d, tsam);
+  [p, m, n] = __ss_dim__ (a, b, c, d);  # determine number of outputs, inputs and states
+
+  stname = repmat ({""}, n, 1);         # cell with empty state names
+
+  ssdata = struct ("a", a, "b", b,
+                   "c", c, "d", d,
+                   "e", [],
+                   "stname", {stname},
+                   "scaled", false);    # struct for ss-specific data
+
+  ltisys = lti (p, m, tsam);            # parent class for general lti data
+
+  sys = class (ssdata, "ss", ltisys);   # create ss object
+
+  if (argc > 0)                         # if there are any properties and values, ...
+    sys = set (sys, varargin{:});       # use the general set function
+  endif
+
+endfunction