changeset 9442:7490fcfe417e octave-forge

control-devel: work on iddata class (3)
author paramaniac
date Wed, 15 Feb 2012 19:39:36 +0000
parents d672dbb87d5a
children 33c370bd7451
files extra/control-devel/devel/test_iddata.m extra/control-devel/inst/@iddata/display.m extra/control-devel/inst/@iddata/iddata.m
diffstat 3 files changed, 154 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/extra/control-devel/devel/test_iddata.m	Wed Feb 15 19:39:36 2012 +0000
@@ -0,0 +1,3 @@
+dat = iddata ((1:10).', (21:30).')
+
+a = iddata ({(1:10).', (21:30).'}, {(31:40).', (41:50).'})
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/extra/control-devel/inst/@iddata/display.m	Wed Feb 15 19:39:36 2012 +0000
@@ -0,0 +1,96 @@
+## Copyright (C) 2012   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 -*-
+## Display routine for iddata objects.
+
+## Author: Lukas Reichlin <lukas.reichlin@gmail.com>
+## Created: February 2012
+## Version: 0.1
+
+function display (dat)
+
+  datname = inputname (1);
+  [outname, p] = __labels__ (dat.outname, "y");
+  [inname, m] = __labels__ (dat.inname, "u");
+  [exname, e] = __labels__ (dat.exname, "exp");
+  
+  [n, p, m, e] = size (dat);
+
+  disp ("");
+
+  if (! isempty (sys.e))
+    __disp_mat__ (sys.e, [sysname, ".e"], stname, stname);
+  endif
+
+  if (! isempty (sys.a))
+    __disp_mat__ (sys.a, [sysname, ".a"], stname, stname);
+    __disp_mat__ (sys.b, [sysname, ".b"], stname, inname);
+    __disp_mat__ (sys.c, [sysname, ".c"], outname, stname);
+  endif
+
+  __disp_mat__ (sys.d, [sysname, ".d"], outname, inname);
+
+  display (sys.lti);  # display sampling time
+
+  if (tsam == -2)
+    disp ("Static gain.");
+  elseif (tsam == 0)
+    disp ("Continuous-time model.");
+  else
+    disp ("Discrete-time model.");
+  endif
+
+endfunction
+
+
+function __disp_mat__ (m, mname, rname, cname)
+
+  MAX_LEN = 12;       # max length of row name and column name
+  [mrows, mcols] = size (m);
+
+  row_name = strjust (strvcat (" ", rname), "left");
+  row_name = row_name(:, 1 : min (MAX_LEN, end));
+  row_name = horzcat (repmat (" ", mrows+1, 3), row_name);
+
+  mat = cell (1, mcols);
+  
+  for k = 1 : mcols
+    cname{k} = cname{k}(:, 1 : min (MAX_LEN, end));
+    acol = vertcat (cname(k), cellstr (deblank (num2str (m(:, k), 4))));
+    mat{k} = strjust (strvcat (acol{:}), "right");
+  endfor
+
+  lcols = cellfun (@columns, mat);
+  lcols_max = 2 + max (horzcat (lcols, 1));
+
+  for k = 1 : mcols
+    mat{k} = horzcat (repmat (" ", mrows+1, lcols_max-lcols(k)), mat{k});
+  endfor
+
+  tsize = terminal_size ();
+  dispcols = max (1, floor ((tsize(2) - columns (row_name)) / lcols_max));
+  disprows = max (1, ceil (mcols / dispcols));
+
+  disp ([mname, " ="]);
+
+  for k = 1 : disprows
+    disp (horzcat (row_name, mat{1+(k-1)*dispcols : min (mcols, k*dispcols)}));
+    disp ("");
+  endfor
+
+endfunction
\ No newline at end of file
--- a/extra/control-devel/inst/@iddata/iddata.m	Wed Feb 15 19:02:46 2012 +0000
+++ b/extra/control-devel/inst/@iddata/iddata.m	Wed Feb 15 19:39:36 2012 +0000
@@ -1,3 +1,57 @@
+## Copyright (C) 2011, 2012   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{dat} =} iddata (@var{y}, @var{u})
+## @deftypefnx{Function File} {@var{dat} =} iddata (@var{y}, @var{u}, @var{tsam})
+## Fit frequency response data with a state-space system.
+## If requested, the returned system is stable and minimum-phase.
+##
+## @strong{Inputs}
+## @table @var
+## @item dat
+## LTI model containing frequency response data of a SISO system.
+## @item n
+## The desired order of the system to be fitted.  @code{n <= length(dat.w)}.
+## @item flag
+## The flag controls whether the returned system is stable and minimum-phase.
+## @table @var
+## @item 0
+## The system zeros and poles are not constrained.  Default value.
+## @item 1
+## The system zeros and poles will have negative real parts in the
+## continuous-time case, or moduli less than 1 in the discrete-time case.
+## @end table
+## @end table
+##
+## @strong{Outputs}
+## @table @var
+## @item sys
+## State-space model of order @var{n}, fitted to frequency response data @var{dat}.
+## @item n
+## The order of the obtained system.  The value of @var{n}
+## could only be modified if inputs @code{n > 0} and @code{flag = 1}.
+## @end table
+##
+## @strong{Algorithm}@*
+## Uses SLICOT SB10YD by courtesy of
+## @uref{http://www.slicot.org, NICONET e.V.}
+## @end deftypefn
+
 ## Author: Lukas Reichlin <lukas.reichlin@gmail.com>
 ## Created: October 2011
 ## Version: 0.1
@@ -11,6 +65,7 @@
     print_usage ();
   endif
 
+  ## TODO: individual tsam for each experiment
   if (! issample (tsam, -1))
     error ("iddata: invalid sampling time");
   endif