]> Creatis software - CreaPhase.git/blobdiff - octave_packages/control-2.3.52/zpk.m
Add a useful package (from Source forge) for octave
[CreaPhase.git] / octave_packages / control-2.3.52 / zpk.m
diff --git a/octave_packages/control-2.3.52/zpk.m b/octave_packages/control-2.3.52/zpk.m
new file mode 100644 (file)
index 0000000..e7dbb99
--- /dev/null
@@ -0,0 +1,105 @@
+## Copyright (C) 2011   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{s} =} zpk (@var{"s"})
+## @deftypefnx {Function File} {@var{z} =} zpk (@var{"z"}, @var{tsam})
+## @deftypefnx {Function File} {@var{sys} =} zpk (@var{sys})
+## @deftypefnx {Function File} {@var{sys} =} zpk (@var{k})
+## @deftypefnx {Function File} {@var{sys} =} zpk (@var{z}, @var{p}, @var{k}, @dots{})
+## @deftypefnx {Function File} {@var{sys} =} zpk (@var{z}, @var{p}, @var{k}, @var{tsam}, @dots{})
+## @deftypefnx {Function File} {@var{sys} =} zpk (@var{z}, @var{p}, @var{k}, @var{tsam}, @dots{})
+## Create transfer function model from zero-pole-gain data.
+## This is just a stop-gap compatibility wrapper since zpk
+## models are not yet implemented.
+##
+## @strong{Inputs}
+## @table @var
+## @item sys
+## LTI model to be converted to transfer function.
+## @item z
+## Cell of vectors containing the zeros for each channel.
+## z@{i,j@} contains the zeros from input j to output i.
+## In the SISO case, a single vector is accepted as well.
+## @item p
+## Cell of vectors containing the poles for each channel.
+## p@{i,j@} contains the poles from input j to output i.
+## In the SISO case, a single vector is accepted as well.
+## @item k
+## Matrix containing the gains for each channel.
+## k(i,j) contains the gain from input j to output i.
+## @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 (tf)} for more information.
+## @end table
+##
+## @strong{Outputs}
+## @table @var
+## @item sys
+## Transfer function model.
+## @end table
+##
+## @seealso{tf, ss, dss, frd}
+## @end deftypefn
+
+## Author: Lukas Reichlin <lukas.reichlin@gmail.com>
+## Created: September 2011
+## Version: 0.1
+
+function sys = zpk (z = {}, p = {}, k = [], varargin)
+
+  switch (nargin)
+    case 0              # sys = zpk ()
+      sys = tf ();
+      return;
+
+    case 1              # sys = zpk (sys), sys = zpk (k), s = zpk ("s")
+      if (isa (z, "lti") || is_real_matrix (z) || ischar (z))
+        sys = tf (z);
+        return;
+      else
+        print_usage ();
+      endif
+
+    case 2              # z = zpk ("z", tsam)
+      if (ischar (z) && issample (p, -1))
+        sys = tf (z, p);
+        return;
+      else
+        print_usage ();
+      endif
+
+    otherwise           # sys = zpk (z, p, k, ...)
+      if (! iscell (z))
+        z = {z};
+      endif
+      if (! iscell (p))
+        p = {p};
+      endif
+      if (! size_equal (z, p, k))
+        error ("zpk: arguments z, p and k must have equal dimensions");
+      endif
+      num = cellfun (@(zer, gain) real (gain * poly (zer)), z, num2cell (k), "uniformoutput", false);
+      den = cellfun (@(pol) real (poly (pol)), p, "uniformoutput", false);
+      sys = tf (num, den, varargin{:});
+  endswitch
+
+endfunction
+