# HG changeset patch # User paramaniac # Date 1329334776 0 # Node ID 7490fcfe417e2eaa7a28cbe995f0c452f898fd6e # Parent d672dbb87d5ab236848896c67217929f4b799d55 control-devel: work on iddata class (3) diff -r d672dbb87d5a -r 7490fcfe417e extra/control-devel/devel/test_iddata.m --- /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 diff -r d672dbb87d5a -r 7490fcfe417e extra/control-devel/inst/@iddata/display.m --- /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 . + +## -*- texinfo -*- +## Display routine for iddata objects. + +## Author: Lukas Reichlin +## 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 diff -r d672dbb87d5a -r 7490fcfe417e extra/control-devel/inst/@iddata/iddata.m --- 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 . + +## -*- 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 ## 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