X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?p=CreaPhase.git;a=blobdiff_plain;f=octave_packages%2Fcontrol-2.3.52%2F%40ss%2Fss.m;fp=octave_packages%2Fcontrol-2.3.52%2F%40ss%2Fss.m;h=72a038bee4046c974ca8bfbdfa93676d39dbcc72;hp=0000000000000000000000000000000000000000;hb=c880e8788dfc484bf23ce13fa2787f2c6bca4863;hpb=1705066eceaaea976f010f669ce8e972f3734b05 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 index 0000000..72a038b --- /dev/null +++ b/octave_packages/control-2.3.52/@ss/ss.m @@ -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 . + +## -*- 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 +## 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