From: <ad...@us...> - 2008-12-05 21:18:40
|
Revision: 5477 http://octave.svn.sourceforge.net/octave/?rev=5477&view=rev Author: adb014 Date: 2008-12-05 21:18:36 +0000 (Fri, 05 Dec 2008) Log Message: ----------- Add three argument place function and add the acker function that is a wrapper for this (For Luca Favatella) Modified Paths: -------------- trunk/octave-forge/main/control/inst/place.m Added Paths: ----------- trunk/octave-forge/main/control/inst/acker.m Added: trunk/octave-forge/main/control/inst/acker.m =================================================================== --- trunk/octave-forge/main/control/inst/acker.m (rev 0) +++ trunk/octave-forge/main/control/inst/acker.m 2008-12-05 21:18:36 UTC (rev 5477) @@ -0,0 +1,46 @@ +## Copyright (C) 2008 Luca Favatella <sla...@gm...> +## +## +## This program 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. +## +## This program 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 this program; see the file COPYING. If not, see +## <http://www.gnu.org/licenses/>. + +## -*- texinfo -*- +## @deftypefn {Function File} {@var{K} =} acker (@var{a}, @var{b}, @var{p}) +## A wrapper for place (@var{a}, @var{b}, @var{p}). +## +## @seealso{place} +## @end deftypefn + +## Author: Luca Favatella <sla...@gm...> +## Version: 0.1 + + # TODO: modify this function to use + # Ackermann's formula instead of being + # only a wrapper for place(a,b,p) + +function K = acker (a, b, p) + if (nargin == 3) + K = place (a, b, p); + else + print_usage (); + endif +endfunction + + +%!test +%! A = [0 1; 3 2]; +%! B = [0; 1]; +%! P = [-1 -0.5]; +%! Kexpected = [3.5 3.5]; +%! assert (acker (A, B, P), Kexpected); \ No newline at end of file Modified: trunk/octave-forge/main/control/inst/place.m =================================================================== --- trunk/octave-forge/main/control/inst/place.m 2008-12-03 00:49:20 UTC (rev 5476) +++ trunk/octave-forge/main/control/inst/place.m 2008-12-05 21:18:36 UTC (rev 5477) @@ -18,6 +18,7 @@ ## -*- texinfo -*- ## @deftypefn {Function File} {@var{K} =} place (@var{sys}, @var{p}) +## @deftypefnx {Function File} {@var{K} =} place (@var{a}, @var{b}, @var{p}) ## Computes the matrix @var{K} such that if the state ## is feedback with gain @var{K}, then the eigenvalues of the closed loop ## system (i.e. @math{A-BK}) are those specified in the vector @var{p}. @@ -42,9 +43,18 @@ ## code adaped by A.S.Hodel (a.s...@en...) for use in controls ## toolbox -function K = place (sys, P) +function K = place (argin1, argin2, argin3) - if (nargin != 2) + if (nargin == 3) + + ## Ctmp is useful to use ss; it doesn't matter what the value of Ctmp is + Ctmp = zeros (1, rows (argin1)); + sys = ss (argin1, argin2, Ctmp); + P = argin3; + elseif (nargin == 2) + sys = argin1; + P = argin2; + else print_usage (); endif @@ -86,12 +96,7 @@ ## equation in the controllable canonical form. ## first we must calculate the controllability matrix M: - M = B; - AA = A; - for n = 2:nx - M(:,n) = AA*B; - AA = AA*A; - endfor + M = ctrb (A, B); ## second, construct the matrix W PCO = PC(nx:-1:1); @@ -123,3 +128,12 @@ endfunction + +%!shared A, B, C, P, Kexpected +%! A = [0 1; 3 2]; +%! B = [0; 1]; +%! C = [2 1]; # C is useful to use ss; it doesn't matter what the value of C is +%! P = [-1 -0.5]; +%! Kexpected = [3.5 3.5]; +%!assert (place (ss (A, B, C), P), Kexpected); +%!assert (place (A, B, P), Kexpected); \ No newline at end of file This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sla...@us...> - 2009-05-22 14:01:17
|
Revision: 5857 http://octave.svn.sourceforge.net/octave/?rev=5857&view=rev Author: slackydeb Date: 2009-05-22 13:58:34 +0000 (Fri, 22 May 2009) Log Message: ----------- Get around system-dependent precision problems when testing functions acker and place. Thanks to Rafael Laboissiere <ra...@de...> for the report and the patch. Modified Paths: -------------- trunk/octave-forge/main/control/inst/acker.m trunk/octave-forge/main/control/inst/place.m Modified: trunk/octave-forge/main/control/inst/acker.m =================================================================== --- trunk/octave-forge/main/control/inst/acker.m 2009-05-22 12:53:31 UTC (rev 5856) +++ trunk/octave-forge/main/control/inst/acker.m 2009-05-22 13:58:34 UTC (rev 5857) @@ -23,7 +23,7 @@ ## @end deftypefn ## Author: Luca Favatella <sla...@gm...> -## Version: 0.1 +## Version: 0.1.1 # TODO: modify this function to use # Ackermann's formula instead of being @@ -43,4 +43,4 @@ %! B = [0; 1]; %! P = [-1 -0.5]; %! Kexpected = [3.5 3.5]; -%! assert (acker (A, B, P), Kexpected); \ No newline at end of file +%! assert (acker (A, B, P), Kexpected, 2*eps); \ No newline at end of file Modified: trunk/octave-forge/main/control/inst/place.m =================================================================== --- trunk/octave-forge/main/control/inst/place.m 2009-05-22 12:53:31 UTC (rev 5856) +++ trunk/octave-forge/main/control/inst/place.m 2009-05-22 13:58:34 UTC (rev 5857) @@ -135,5 +135,5 @@ %! C = [2 1]; # C is useful to use ss; it doesn't matter what the value of C is %! P = [-1 -0.5]; %! Kexpected = [3.5 3.5]; -%!assert (place (ss (A, B, C), P), Kexpected); -%!assert (place (A, B, P), Kexpected); \ No newline at end of file +%!assert (place (ss (A, B, C), P), Kexpected, 2*eps); +%!assert (place (A, B, P), Kexpected, 2*eps); \ No newline at end of file This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <par...@us...> - 2009-07-16 19:34:08
|
Revision: 6018 http://octave.svn.sourceforge.net/octave/?rev=6018&view=rev Author: paramaniac Date: 2009-07-16 19:34:01 +0000 (Thu, 16 Jul 2009) Log Message: ----------- feedback: reduced warnings Modified Paths: -------------- trunk/octave-forge/main/control/inst/feedback.m trunk/octave-forge/main/control/inst/sysfeedback.m Modified: trunk/octave-forge/main/control/inst/feedback.m =================================================================== --- trunk/octave-forge/main/control/inst/feedback.m 2009-07-15 13:14:09 UTC (rev 6017) +++ trunk/octave-forge/main/control/inst/feedback.m 2009-07-16 19:34:01 UTC (rev 6018) @@ -19,11 +19,10 @@ ## @deftypefnx{Function File} {@var{sys} =} feedback (@var{sys1}, @var{sys2}, @var{sign}) ## @deftypefnx{Function File} {@var{sys} =} feedback (@var{sys1}, @var{sys2}, @var{feedin}, @var{feedout}) ## @deftypefnx{Function File} {@var{sys} =} feedback (@var{sys1}, @var{sys2}, @var{feedin}, @var{feedout}, @var{sign}) -## Returns model sys for the feedback interconnection; i. e. filters the output of sys1 -## through sys2 and subtracts it from the input. Displays warnings if inputs, outputs -## or states of sys1 and sys2 have equal names. Occasionally warns about possible algebraic -## loops as well. These warnings are perfectly harmless and are due to the internal use -## of sysgroup and sysconnect. +## Returns model sys for the negative feedback interconnection; i. e. filters the output of +## sys1 through sys2 and subtracts it from the input. Occasionally warns about possible +## algebraic loops even if they don't exist. These warnings are perfectly harmless and are +## due to the internal use of sysconnect. ## ## @strong{Inputs} ## @table @var @@ -165,6 +164,26 @@ ## Group sys1 and sys2 together + + ## Rename inputs, outputs and states of sys2 temporarily + ## to avoid spurious warnings from sysgroup + + in_name = __sysdefioname__ (n_in_2, "in_feedback_tmp_name"); + out_name = __sysdefioname__ (n_out_2, "out_feedback_tmp_name"); + + sys2 = syssetsignals (sys2, "in", in_name); + sys2 = syssetsignals (sys2, "out", out_name); + + if ((n_c_states_2 + n_d_states_2) != 0) # If there are any states + + for k = 1 : (n_c_states_2 + n_d_states_2) + st_name{k} = sprintf ("st_feedback_tmp_name_%d", k); + endfor + + sys2 = syssetsignals (sys2, "st", st_name); + + endif + sys = sysgroup(sys1, sys2); @@ -188,11 +207,20 @@ ## Connect outputs with inputs + ## FIXME: Unable to prevent algebraic loop warnings from sysconnect + ## even if connections are made one by one with + ## for k = 1 : l_feedout + ## sys = sysconnect (sys, feedout(k), in_idx(k)); + ## endfor + ## and + ## for k = 1 : l_feedin + ## sys = sysconnect (sys, out_idx(k), in_dup_idx(k)); + ## endfor - ## connect outputs of sys1 to inputs of sys2 - ## output indices of sys1 start at (1) + ## Connect outputs of sys1 to inputs of sys2 + ## Output indices of sys1 start at (1) ## and end at (n_out_1) --> use feedout! - ## input indices of sys2 start at (n_in_1 + 1) + ## Input indices of sys2 start at (n_in_1 + 1) ## and end at (n_in_1 + n_in_2) for k = 1 : l_feedout @@ -201,12 +229,12 @@ sys = sysconnect (sys, feedout, in_idx); - ## connect outputs of sys2 to inputs of sys1 - ## output indices of sys 2 start at (n_out_1 + 1) + ## Connect outputs of sys2 to inputs of sys1 + ## Output indices of sys 2 start at (n_out_1 + 1) ## and end at (n_out_1 + n_out_2) - ## duplicated input indices of sys 1 start at (n_in_1 + n_in_2 + 1) + ## Duplicated input indices of sys 1 start at (n_in_1 + n_in_2 + 1) ## and end at (n_in_1 + n_in_2 + l_feedin) - ## sequence of feedin already mapped to duplicated inputs + ## Sequence of feedin already mapped to duplicated inputs ## ---> (n_in_1 + n_in_2 + k) for k = 1 : l_feedin Modified: trunk/octave-forge/main/control/inst/sysfeedback.m =================================================================== --- trunk/octave-forge/main/control/inst/sysfeedback.m 2009-07-15 13:14:09 UTC (rev 6017) +++ trunk/octave-forge/main/control/inst/sysfeedback.m 2009-07-16 19:34:01 UTC (rev 6018) @@ -41,15 +41,15 @@ ## | | ## +---------------------+ ## -## Y(s) SYS(s) -## RETSYS(s) = ------ = ------------ -## U(s) I + SYS(s) +## Y(s) SYS(s) +## RETSYS(s) = ------ = ------------ +## U(s) I + SYS(s) ## ## ## A SIMPLE EXAMPLE ## -## P(s) : Plant L(s) : Open Loop -## C(s) : Controller T(s) : Closed Loop +## P(s) : Plant L(s) : Open Loop +## C(s) : Controller T(s) : Closed Loop ## ## r + e +--------+ u +--------+ y ## ------>(+)----->| C(s) |------>| P(s) |-----+-----> @@ -57,11 +57,11 @@ ## | | ## +---------------------------------------+ ## -## L(s) = P(s) C(s) ---> L = sysmult(P, C) +## L(s) = P(s) C(s) ---> L = sysmult(P, C) ## -## L(s) -## T(s) = ---------- ---> T = sysfeedback(L) -## 1 + L(s) +## L(s) +## T(s) = ---------- ---> T = sysfeedback(L) +## 1 + L(s) ## ## r +--------+ y ## ------->| T(s) |---------> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <par...@us...> - 2009-07-19 02:46:39
|
Revision: 6027 http://octave.svn.sourceforge.net/octave/?rev=6027&view=rev Author: paramaniac Date: 2009-07-19 02:46:35 +0000 (Sun, 19 Jul 2009) Log Message: ----------- fixed bugs for mixed cont/disc systems Modified Paths: -------------- trunk/octave-forge/main/control/inst/feedback.m trunk/octave-forge/main/control/inst/series.m Modified: trunk/octave-forge/main/control/inst/feedback.m =================================================================== --- trunk/octave-forge/main/control/inst/feedback.m 2009-07-18 21:06:08 UTC (rev 6026) +++ trunk/octave-forge/main/control/inst/feedback.m 2009-07-19 02:46:35 UTC (rev 6027) @@ -92,16 +92,18 @@ ## Handle digital gains if (sys1wasmatrix) - if (is_digital (sys2, 2)) + if (is_digital (sys2, 2) == 1) # -1 for mixed systems! t_sam = sysgettsam (sys2); sys1 = c2d (sys1, t_sam); + sys1 = syschtsam (sys1, t_sam); # sys1 = c2d (sys1, t_sam) doesn't work endif endif if (sys2wasmatrix) - if (is_digital (sys1, 2)) + if (is_digital (sys1, 2) == 1) t_sam = sysgettsam (sys1); sys2 = c2d (sys2, t_sam); + sys2 = syschtsam (sys2, t_sam); endif endif Modified: trunk/octave-forge/main/control/inst/series.m =================================================================== --- trunk/octave-forge/main/control/inst/series.m 2009-07-18 21:06:08 UTC (rev 6026) +++ trunk/octave-forge/main/control/inst/series.m 2009-07-19 02:46:35 UTC (rev 6027) @@ -102,16 +102,18 @@ ## Handle digital gains if (sys1wasmatrix) - if (is_digital (sys2, 2)) + if (is_digital (sys2, 2) == 1) # -1 for mixed systems! t_sam = sysgettsam (sys2); sys1 = c2d (sys1, t_sam); + sys1 = syschtsam (sys1, t_sam); # sys1 = c2d (sys1, t_sam) doesn't work endif endif if (sys2wasmatrix) - if (is_digital (sys1, 2)) + if (is_digital (sys1, 2) == 1) t_sam = sysgettsam (sys1); sys2 = c2d (sys2, t_sam); + sys2 = syschtsam (sys2, t_sam); endif endif This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <par...@us...> - 2009-07-19 02:49:38
|
Revision: 6028 http://octave.svn.sourceforge.net/octave/?rev=6028&view=rev Author: paramaniac Date: 2009-07-19 02:49:32 +0000 (Sun, 19 Jul 2009) Log Message: ----------- added 2 new functions: buildsens, buildretdiff Added Paths: ----------- trunk/octave-forge/main/control/inst/buildretdiff.m trunk/octave-forge/main/control/inst/buildsens.m Added: trunk/octave-forge/main/control/inst/buildretdiff.m =================================================================== --- trunk/octave-forge/main/control/inst/buildretdiff.m (rev 0) +++ trunk/octave-forge/main/control/inst/buildretdiff.m 2009-07-19 02:49:32 UTC (rev 6028) @@ -0,0 +1,86 @@ +## Copyright (C) 2009 Lukas Reichlin <luk...@sw...> +## +## This program 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. +## +## This program 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 this program. If not, see <http://www.gnu.org/licenses/>. + +## -*- texinfo -*- +## @deftypefn{Function File} {@var{retsys} =} buildretdiff (@var{sys}) +## Build the return difference of a system. Useful in combination with svplot. +## +## @strong{Inputs} +## @table @var +## @item sys +## Open loop system data structure. The number of inputs and outputs must be equal. +## @end table +## +## @strong{Outputs} +## @table @var +## @item retsys +## System data structure of the return difference. +## @end table +## +## @seealso{svplot} +## +## @example +## @group +## Q(s) = I + L(s) = I + P(s) C(s) +## @end group +## @end example +## +## @end deftypefn + +## Version: 0.1 + +function retsys = buildretdiff (sys) + + if (nargin != 1) + print_usage (); + endif + + if(! isstruct (sys)) + error ("buildretdiff: argument sys must be a system data structure"); + endif + + [n_c_states, n_d_states, n_in, n_out] = sysdimensions (sys); + t_sam = sysgettsam (sys); + digital = is_digital(sys, 2); + + if (n_in != n_out) + error ("buildretdiff: number of inputs and outputs must be equal"); + endif + + if (digital == -1) + error ("buildretdiff: system must be either purely continuous or purely discrete"); + endif + + sysI = ss ([], [], [], eye (n_in), t_sam); + + retsys = sysadd (sys, sysI); + +endfunction + + +%!shared numL, denL, numQ, denQ, numQ_exp, denQ_exp +%! +%! numL = [1]; +%! denL = [1, 1]; +%! L = tf(numL, denL); +%! +%! Q = buildretdiff(L); +%! [numQ, denQ] = sys2tf(Q); +%! +%! numQ_exp = [1, 2]; +%! denQ_exp = [1, 1]; +%! +%!assert(numQ, numQ_exp); +%!assert(denQ, denQ_exp); Added: trunk/octave-forge/main/control/inst/buildsens.m =================================================================== --- trunk/octave-forge/main/control/inst/buildsens.m (rev 0) +++ trunk/octave-forge/main/control/inst/buildsens.m 2009-07-19 02:49:32 UTC (rev 6028) @@ -0,0 +1,114 @@ +## Copyright (C) 2009 Lukas Reichlin <luk...@sw...> +## +## This program 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. +## +## This program 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 this program. If not, see <http://www.gnu.org/licenses/>. + +## -*- texinfo -*- +## @deftypefn{Function File} {@var{retsys} =} buildsens (@var{sys}) +## Return the sensitivity of a system. Useful in combination with svplot. +## +## @strong{Inputs} +## @table @var +## @item sys +## Open loop system data structure. The number of inputs and outputs must be equal. +## @end table +## +## @strong{Outputs} +## @table @var +## @item retsys +## Sensitivity system data structure. +## @end table +## +## @seealso{svplot} +## +## @example +## @group +## Y(s) 1 1 +## S(s) = ------ = ---------- = ----------------- +## D(s) 1 + L(s) 1 + P(s) C(s) +## +## +## +## | d +## | +## r + e +--------+ u +--------+ v y +## ------>(+)----->| C(s) |------>| P(s) |----->(+)---+-----> +## ^ - +--------+ +--------+ | +## | | +## +----------------------------------------------+ +## +## L(s) = P(s) C(s) ---> L = sysmult(P, C) +## +## 1 +## S(s) = ---------- ---> S = buildsens(L) +## 1 + L(s) +## +## d +--------+ y +## ------->| S(s) |---------> +## +--------+ +## @end group +## @end example +## +## @end deftypefn + +## Version: 0.1 + +function retsys = buildsens (sys) + + if (nargin != 1) + print_usage (); + endif + + if(! isstruct (sys)) + error ("buildsens: argument sys must be a system data structure"); + endif + + [n_c_states, n_d_states, n_in, n_out] = sysdimensions (sys); + t_sam = sysgettsam (sys); + digital = is_digital(sys, 2); + + if (n_in != n_out) + error ("buildsens: number of inputs and outputs must be equal"); + endif + + if (digital == -1) + error ("buildsens: system must be either purely continuous or purely discrete"); + endif + + sysI = ss ([], [], [], eye (n_in), t_sam); + + for k = 1 : n_in + in_scl(k) = -1; + endfor + + sys = sysscale (sys, [], diag (in_scl)); + + retsys = feedback (sysI, sys, +1); + +endfunction + + +%!shared numL, denL, numS, denS, numS_exp, denS_exp +%! +%! numL = [1]; +%! denL = [1, 1]; +%! L = tf(numL, denL); +%! +%! S = buildsens(L); +%! [numS, denS] = sys2tf(S); +%! +%! numS_exp = [1, 1]; +%! denS_exp = [1, 2]; +%! +%!assert(numS, numS_exp, eps); +%!assert(denS, denS_exp); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <par...@us...> - 2009-07-19 06:38:11
|
Revision: 6029 http://octave.svn.sourceforge.net/octave/?rev=6029&view=rev Author: paramaniac Date: 2009-07-19 06:38:10 +0000 (Sun, 19 Jul 2009) Log Message: ----------- changed from the obsolete create_set to unique in order to prevent warnings Modified Paths: -------------- trunk/octave-forge/main/control/inst/__bodquist__.m trunk/octave-forge/main/control/inst/sortcom.m Modified: trunk/octave-forge/main/control/inst/__bodquist__.m =================================================================== --- trunk/octave-forge/main/control/inst/__bodquist__.m 2009-07-19 02:49:32 UTC (rev 6028) +++ trunk/octave-forge/main/control/inst/__bodquist__.m 2009-07-19 06:38:10 UTC (rev 6029) @@ -138,7 +138,7 @@ wnew = vec(wseg)'; # make a row vector wnew = wnew(find (wnew != 0)); wnew = sort (wnew); - wnew = create_set (wnew); + wnew = unique (wnew); if (isempty (wnew)) # all small crossovers pcnt = 0; else Modified: trunk/octave-forge/main/control/inst/sortcom.m =================================================================== --- trunk/octave-forge/main/control/inst/sortcom.m 2009-07-19 02:49:32 UTC (rev 6028) +++ trunk/octave-forge/main/control/inst/sortcom.m 2009-07-19 06:38:10 UTC (rev 6029) @@ -90,7 +90,7 @@ ## sort common datavec values if (! isempty (zidx)) - for iv = create_set (datavec(zidx)) + for iv = unique (datavec(zidx)) vidx = find (datavec == iv); [vals, imidx] = sort (imag (yy(vidx))); yy(vidx) = yy(vidx(imidx)); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <par...@us...> - 2009-07-23 11:44:39
|
Revision: 6042 http://octave.svn.sourceforge.net/octave/?rev=6042&view=rev Author: paramaniac Date: 2009-07-23 11:44:35 +0000 (Thu, 23 Jul 2009) Log Message: ----------- workaround for failing c2d Modified Paths: -------------- trunk/octave-forge/main/control/inst/feedback.m trunk/octave-forge/main/control/inst/series.m Modified: trunk/octave-forge/main/control/inst/feedback.m =================================================================== --- trunk/octave-forge/main/control/inst/feedback.m 2009-07-23 10:43:14 UTC (rev 6041) +++ trunk/octave-forge/main/control/inst/feedback.m 2009-07-23 11:44:35 UTC (rev 6042) @@ -94,16 +94,14 @@ if (sys1wasmatrix) if (is_digital (sys2, 2) == 1) # -1 for mixed systems! t_sam = sysgettsam (sys2); - sys1 = c2d (sys1, t_sam); - sys1 = syschtsam (sys1, t_sam); # sys1 = c2d (sys1, t_sam) doesn't work + sys1 = ss ([], [], [], varargin{1}, t_sam); # sys1 = c2d (sys1, t_sam) doesn't work endif endif if (sys2wasmatrix) if (is_digital (sys1, 2) == 1) t_sam = sysgettsam (sys1); - sys2 = c2d (sys2, t_sam); - sys2 = syschtsam (sys2, t_sam); + sys2 = ss ([], [], [], varargin{2}, t_sam); endif endif Modified: trunk/octave-forge/main/control/inst/series.m =================================================================== --- trunk/octave-forge/main/control/inst/series.m 2009-07-23 10:43:14 UTC (rev 6041) +++ trunk/octave-forge/main/control/inst/series.m 2009-07-23 11:44:35 UTC (rev 6042) @@ -104,16 +104,14 @@ if (sys1wasmatrix) if (is_digital (sys2, 2) == 1) # -1 for mixed systems! t_sam = sysgettsam (sys2); - sys1 = c2d (sys1, t_sam); - sys1 = syschtsam (sys1, t_sam); # sys1 = c2d (sys1, t_sam) doesn't work + sys1 = ss ([], [], [], varargin{1}, t_sam); # sys1 = c2d (sys1, t_sam) doesn't work endif endif if (sys2wasmatrix) if (is_digital (sys1, 2) == 1) t_sam = sysgettsam (sys1); - sys2 = c2d (sys2, t_sam); - sys2 = syschtsam (sys2, t_sam); + sys2 = ss ([], [], [], varargin{2}, t_sam); endif endif This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sla...@us...> - 2009-08-17 08:39:36
|
Revision: 6109 http://octave.svn.sourceforge.net/octave/?rev=6109&view=rev Author: slackydeb Date: 2009-08-17 08:39:29 +0000 (Mon, 17 Aug 2009) Log Message: ----------- Newline style fixes. Modified Paths: -------------- trunk/octave-forge/main/control/inst/svplot.m trunk/octave-forge/main/control/inst/unitfeedback.m Modified: trunk/octave-forge/main/control/inst/svplot.m =================================================================== --- trunk/octave-forge/main/control/inst/svplot.m 2009-08-17 08:19:20 UTC (rev 6108) +++ trunk/octave-forge/main/control/inst/svplot.m 2009-08-17 08:39:29 UTC (rev 6109) @@ -214,4 +214,4 @@ %! [sigma_min_obs, sigma_max_obs, w_obs] = svplot (ss (A, B, C, D), w); %!assert (sigma_min_obs, sigma_min_exp, 4*eps); # tolerance manually tweaked %!assert (sigma_max_obs, sigma_max_exp, 12*eps); # tolerance manually tweaked -%!assert (w_obs, w_exp, 2*eps); \ No newline at end of file +%!assert (w_obs, w_exp, 2*eps); Modified: trunk/octave-forge/main/control/inst/unitfeedback.m =================================================================== --- trunk/octave-forge/main/control/inst/unitfeedback.m 2009-08-17 08:19:20 UTC (rev 6108) +++ trunk/octave-forge/main/control/inst/unitfeedback.m 2009-08-17 08:39:29 UTC (rev 6109) @@ -63,4 +63,4 @@ %! num_exp = 1; %! den_exp = [1 1]; %! -%! assert ([num den], [num_exp den_exp]); \ No newline at end of file +%! assert ([num den], [num_exp den_exp]); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <par...@us...> - 2009-08-25 10:09:54
|
Revision: 6135 http://octave.svn.sourceforge.net/octave/?rev=6135&view=rev Author: paramaniac Date: 2009-08-25 10:09:44 +0000 (Tue, 25 Aug 2009) Log Message: ----------- minor improvements for svplot and initial Modified Paths: -------------- trunk/octave-forge/main/control/inst/initial.m trunk/octave-forge/main/control/inst/svplot.m Modified: trunk/octave-forge/main/control/inst/initial.m =================================================================== --- trunk/octave-forge/main/control/inst/initial.m 2009-08-24 21:05:03 UTC (rev 6134) +++ trunk/octave-forge/main/control/inst/initial.m 2009-08-25 10:09:44 UTC (rev 6135) @@ -185,6 +185,7 @@ for k = 1 : n_out subplot (n_out, 1, k) plot (t, y(:, k)) + grid on if (k == 1) title ("Response to Initial Conditions") endif Modified: trunk/octave-forge/main/control/inst/svplot.m =================================================================== --- trunk/octave-forge/main/control/inst/svplot.m 2009-08-24 21:05:03 UTC (rev 6134) +++ trunk/octave-forge/main/control/inst/svplot.m 2009-08-25 10:09:44 UTC (rev 6135) @@ -180,6 +180,10 @@ sigma_min_db = 20 * log10 (sigma_min); sigma_max_db = 20 * log10 (sigma_max); + ## Determine axes + ax_vec = axis2dlim ([[w(:), sigma_min_db(:)]; [w(:), sigma_max_db(:)]]); + ax_vec(1:2) = [min(w), max(w)]; + ## Determine xlabel if (digital) xl_str = sprintf ('Frequency [rad/s] Pi / T = %g', pi/t_sam); @@ -189,6 +193,7 @@ ## Plot results semilogx (w, sigma_min_db, 'b', w, sigma_max_db, 'b') + axis (ax_vec) title ('Singular Values') xlabel (xl_str) ylabel ('Singular Values [dB]') This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <par...@us...> - 2009-08-25 15:15:57
|
Revision: 6136 http://octave.svn.sourceforge.net/octave/?rev=6136&view=rev Author: paramaniac Date: 2009-08-25 15:15:49 +0000 (Tue, 25 Aug 2009) Log Message: ----------- parallel: improved m*tl*b compatibility Modified Paths: -------------- trunk/octave-forge/main/control/inst/bddemo.m trunk/octave-forge/main/control/inst/parallel.m Added Paths: ----------- trunk/octave-forge/main/control/inst/sysparallel.m Modified: trunk/octave-forge/main/control/inst/bddemo.m =================================================================== --- trunk/octave-forge/main/control/inst/bddemo.m 2009-08-25 10:09:44 UTC (rev 6135) +++ trunk/octave-forge/main/control/inst/bddemo.m 2009-08-25 15:15:49 UTC (rev 6136) @@ -46,7 +46,7 @@ "sysmult: F(s) = G(s)*H(s) (series connection)", ... "sysprune: keep only specified inputs/outputs", ... "sysscale: scale inputs/outputs by specified gain matrices", ... - "parallel: parallel connection of two systems", ... + "sysparallel: parallel connection of two systems", ... "sysfeedback: closed loop of a system", ... "buildssic: the combination of all", ... "Design examples:", ... @@ -273,8 +273,8 @@ disp("See the design examples (option 14) for use of sysscale.") prompt elseif ( k == 11) - help parallel - disp("parallel operates by making a call to sysgroup and sysscale.") + help sysparallel + disp("sysparallel operates by making a call to sysgroup and sysscale.") disp("Example:") sys1 = tf(1,[1, 1],0,"in1","out1"); sys2 = tf(2,[1, 2],0,"in2","out2"); @@ -282,12 +282,12 @@ sysout(sys1); disp("sys2=") sysout(sys2); - cmd = "sysp = parallel(sys1,sys2);"; + cmd = "sysp = sysparallel(sys1,sys2);"; run_cmd disp("sysp=") sysout(sysp); prompt - disp("parallel can be used for multiple input systems as well:") + disp("sysparallel can be used for multiple input systems as well:") in1 = {"u1.1","u1.2"}; in2 = {"u2.1","u2.2"}; @@ -307,7 +307,7 @@ sysout(sys1); disp("sys2=") sysout(sys2); - cmd = "sysp = parallel(sys1,sys2);"; + cmd = "sysp = sysparallel(sys1,sys2);"; run_cmd disp("sysp=") sysout(sysp); @@ -333,7 +333,7 @@ disp("The interconnections may be of arbitrary complexity.") disp("The use of buildssic is an alternative to sysgroup,") disp("sysadd/syssub, sysappend, sysconnect, sysdup, sysmult") - disp("sysprune, sysscale, parallel etc.") + disp("sysprune, sysscale, sysparallel etc.") disp("In contrast to these functions buildssic does not") disp("handle mixed continuous and discrete systems. However,") disp("discrete systems can be connected as long as their") Modified: trunk/octave-forge/main/control/inst/parallel.m =================================================================== --- trunk/octave-forge/main/control/inst/parallel.m 2009-08-25 10:09:44 UTC (rev 6135) +++ trunk/octave-forge/main/control/inst/parallel.m 2009-08-25 15:15:49 UTC (rev 6136) @@ -1,72 +1,157 @@ -## Copyright (C) 1996, 2000, 2002, 2004, 2005, 2006, 2007 -## Auburn University. All rights reserved. +## Copyright (C) 2009 Lukas Reichlin <luk...@sw...> ## +## This program 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. ## -## This program 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. +## This program 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. ## -## This program 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 this program; see the file COPYING. If not, see -## <http://www.gnu.org/licenses/>. +## along with this program. If not, see <http://www.gnu.org/licenses/>. ## -*- texinfo -*- -## @deftypefn {Function File} {@var{ksys} =} parallel (@var{asys}, @var{bsys}) -## Forms the parallel connection of two systems. +## @deftypefn{Function File} {@var{sys} =} parallel (@var{sys1}, @var{sys2}) +## @deftypefnx{Function File} {@var{sys} =} parallel (@var{sys1}, @var{sys2}, @var{in1}, @var{in2}, @var{out1}, @var{out2}) +## Parallel connection of two systems. +## @math{sys = sys1 + sys2} ## +## @strong{Inputs} +## @table @var +## @item sys1 +## System data structure or gain matrix. +## @item sys2 +## System data structure or gain matrix. +## @item in1 +## . +## @item in2 +## . +## @item out1 +## . +## @item out2 +## . +## @end table +## +## @strong{Outputs} +## @table @var +## @item sys +## System data structure of parallel connection. +## @end table +## +## @seealso{sysmult} +## ## @example ## @group -## -------------------- -## | -------- | -## u ----->|----> | asys |--->|----> y1 -## | | -------- | -## | | -------- | -## |--->|----> | bsys |--->|----> y2 -## | -------- | -## -------------------- -## ksys +## .......................... +## : +--------+ : +## : +-->| sys1 |---+ : +## u : | +--------+ | + : y +## -------+ O---------> +## : | +--------+ | + : +## : +-->| sys2 |---+ : +## : +--------+ : +## :.........sys............: +## +## sys = parallel (sys1, sys2) +## +## +## .......................... +## v1 : +--------+ : z1 +## ---------->| |-------------> +## : | sys1 | : +## : +-->| |---+ : +## u : | +--------+ | + : y +## -------+ O---------> +## : | +--------+ | + : +## : +-->| |---+ : +## v2 : | sys2 | : z2 +## ---------->| |-------------> +## : +--------+ : +## :.........sys............. +## +## in1 = [2] +## in2 = [1] +## out1 = [2] +## out2 = [1] +## sys = parallel (sys1, sys2, in1, in2, out1, out2) ## @end group ## @end example +## ## @end deftypefn -## Author: David Clem -## Created: August 15, 1994 -## completely rewritten Oct 1996 a s hodel -## SYS_INTERNAL accesses members of system structure +## Author: Lukas Reichlin +## Rewritten from scratch for better compatibility in July 2009 +## Version: 0.1 -function sysp = parallel (Asys, Bsys) +function sys = parallel (_sys1, _sys2, in1, in2, out1, out2) - if(nargin != 2) + if (nargin != 2 && nargin != 6) print_usage (); endif - if (! isstruct(Asys) ) - error ("1st input argument is not a system data structure"); - elseif (! isstruct(Bsys) ) - error ("2nd input argument is not a system data structure"); + + ## Sanitize sys1 + if (isstruct (_sys1)) + sys1 = _sys1; + sys1wasmatrix = 0; + elseif (ismatrix (_sys1)) + sys1 = ss ([], [], [], _sys1); + sys1wasmatrix = 1; + else + error ("parallel: argument 1 (sys1) invalid"); endif - [Ann, Anz, mA] = sysdimensions(Asys); - [Bnn, Bnz, mB] = sysdimensions(Bsys); - if (mA != mB) - error ("Asys has %d inputs, Bsys has %d inputs", mA, mB); + + ## Sanitize sys2 + if (isstruct (_sys2)) + sys2 = _sys2; + sys2wasmatrix = 0; + elseif (ismatrix (_sys2)) + sys2 = ss ([], [], [], _sys2); + sys2wasmatrix = 1; + else + error ("parallel: argument 2 (sys2) invalid"); endif - ## save signal names - Ain = sysgetsignals (Asys, "in"); + ## Handle digital gains + if (sys1wasmatrix) + if (is_digital (sys2, 2) == 1) # -1 for mixed systems! + t_sam = sysgettsam (sys2); + sys1 = ss ([], [], [], _sys1, t_sam); # sys1 = c2d (sys1, t_sam) doesn't work + endif + endif - ## change signal names to avoid warning messages from sysgroup - Asys = syssetsignals (Asys, "in", __sysdefioname__ (length (Ain), "Ain_u")); - Bsys = syssetsignals (Bsys, "in", __sysdefioname__ (length (Ain), "Bin_u")); + if (sys2wasmatrix) + if (is_digital (sys1, 2) == 1) + t_sam = sysgettsam (sys1); + sys2 = ss ([], [], [], _sys2, t_sam); + endif + endif - sysp = sysgroup (Asys, Bsys); - sysD = ss ([], [], [], [eye(mA); eye(mA)]); - sysp = sysmult (sysp, sysD); - sysp = syssetsignals (sysp, "in", Ain); + if (nargin == 2) # Simple case + warning ("parallel: meaning has changed for compatibility reasons. use sysparallel for the old octave implementation."); + + ## Let sysadd do the job + sys = sysadd (sys1, sys2); + + else # Complex case + + error ("parallel: complex case (6 arguments) not implemented yet"); + + endif + endfunction + + +%!shared G, H, sys, num, den, num_exp, den_exp +%! G = ss ([0], [1], [1], [0]); +%! H = 1; +%! sys = parallel1 (G, H); +%! [num, den] = sys2tf (sys); +%! num_exp = [1, 1]; +%! den_exp = [1, 0]; +%!assert(num, num_exp); +%!assert(den, den_exp); Added: trunk/octave-forge/main/control/inst/sysparallel.m =================================================================== --- trunk/octave-forge/main/control/inst/sysparallel.m (rev 0) +++ trunk/octave-forge/main/control/inst/sysparallel.m 2009-08-25 15:15:49 UTC (rev 6136) @@ -0,0 +1,72 @@ +## Copyright (C) 1996, 2000, 2002, 2004, 2005, 2006, 2007 +## Auburn University. All rights reserved. +## +## +## This program 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. +## +## This program 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 this program; see the file COPYING. If not, see +## <http://www.gnu.org/licenses/>. + +## -*- texinfo -*- +## @deftypefn {Function File} {@var{ksys} =} sysparallel (@var{asys}, @var{bsys}) +## Forms the parallel connection of two systems. +## +## @example +## @group +## -------------------- +## | -------- | +## u ----->|----> | asys |--->|----> y1 +## | | -------- | +## | | -------- | +## |--->|----> | bsys |--->|----> y2 +## | -------- | +## -------------------- +## ksys +## @end group +## @end example +## @end deftypefn + +## Author: David Clem +## Created: August 15, 1994 +## completely rewritten Oct 1996 a s hodel +## SYS_INTERNAL accesses members of system structure + +function sysp = sysparallel (Asys, Bsys) + + if(nargin != 2) + print_usage (); + endif + if (! isstruct(Asys) ) + error ("1st input argument is not a system data structure"); + elseif (! isstruct(Bsys) ) + error ("2nd input argument is not a system data structure"); + endif + [Ann, Anz, mA] = sysdimensions(Asys); + [Bnn, Bnz, mB] = sysdimensions(Bsys); + if (mA != mB) + error ("Asys has %d inputs, Bsys has %d inputs", mA, mB); + endif + + ## save signal names + Ain = sysgetsignals (Asys, "in"); + + ## change signal names to avoid warning messages from sysgroup + Asys = syssetsignals (Asys, "in", __sysdefioname__ (length (Ain), "Ain_u")); + Bsys = syssetsignals (Bsys, "in", __sysdefioname__ (length (Ain), "Bin_u")); + + sysp = sysgroup (Asys, Bsys); + sysD = ss ([], [], [], [eye(mA); eye(mA)]); + + sysp = sysmult (sysp, sysD); + sysp = syssetsignals (sysp, "in", Ain); + +endfunction This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sla...@us...> - 2009-08-26 15:02:08
|
Revision: 6147 http://octave.svn.sourceforge.net/octave/?rev=6147&view=rev Author: slackydeb Date: 2009-08-26 15:01:59 +0000 (Wed, 26 Aug 2009) Log Message: ----------- Fix improper use of FIXME. Modified Paths: -------------- trunk/octave-forge/main/control/inst/gensig.m trunk/octave-forge/main/control/inst/initial.m Modified: trunk/octave-forge/main/control/inst/gensig.m =================================================================== --- trunk/octave-forge/main/control/inst/gensig.m 2009-08-26 14:39:57 UTC (rev 6146) +++ trunk/octave-forge/main/control/inst/gensig.m 2009-08-26 15:01:59 UTC (rev 6147) @@ -87,4 +87,5 @@ endfunction -## FIXME: Add a test + +## TODO: Add a test Modified: trunk/octave-forge/main/control/inst/initial.m =================================================================== --- trunk/octave-forge/main/control/inst/initial.m 2009-08-26 14:39:57 UTC (rev 6146) +++ trunk/octave-forge/main/control/inst/initial.m 2009-08-26 15:01:59 UTC (rev 6147) @@ -64,7 +64,7 @@ ## Created: August 16, 2009 ## based on __stepimp__.m of Kai P. Mueller and A. Scottedward Hodel ## Version: 0.1 alpha -## FIXME: Needs thorough testing for discrete systems! +## TODO: Needs thorough testing for discrete systems! function [y_r, t_r, x_r] = initial (sys, x_0, t_final, dt) @@ -200,4 +200,6 @@ endfunction -## FIXME: Add a test \ No newline at end of file + +## TODO: Add a purely continuous system test +## TODO: Add a purely discrete system test This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <par...@us...> - 2009-08-27 03:13:20
|
Revision: 6153 http://octave.svn.sourceforge.net/octave/?rev=6153&view=rev Author: paramaniac Date: 2009-08-27 03:13:09 +0000 (Thu, 27 Aug 2009) Log Message: ----------- cosmetic changes Modified Paths: -------------- trunk/octave-forge/main/control/inst/initial.m trunk/octave-forge/main/control/inst/svplot.m Modified: trunk/octave-forge/main/control/inst/initial.m =================================================================== --- trunk/octave-forge/main/control/inst/initial.m 2009-08-27 02:29:27 UTC (rev 6152) +++ trunk/octave-forge/main/control/inst/initial.m 2009-08-27 03:13:09 UTC (rev 6153) @@ -1,5 +1,6 @@ -## Copyright (C) 1996, 1998, 2000, 2003, 2004, 2005, 2006, 2007, 2009 +## Copyright (C) 1996, 1998, 2000, 2003, 2004, 2005, 2006, 2007 ## Auburn University. All rights reserved. +## Copyright (C) 2009 Lukas Reichlin. All rights reserved. ## ## This program is free software; you can redistribute it and/or modify it ## under the terms of the GNU General Public License as published by Modified: trunk/octave-forge/main/control/inst/svplot.m =================================================================== --- trunk/octave-forge/main/control/inst/svplot.m 2009-08-27 02:29:27 UTC (rev 6152) +++ trunk/octave-forge/main/control/inst/svplot.m 2009-08-27 03:13:09 UTC (rev 6153) @@ -17,6 +17,7 @@ ## @deftypefn{Function File} {[@var{sigma_min}, @var{sigma_max}, @var{w}] =} svplot (@var{sys}) ## @deftypefnx{Function File} {[@var{sigma_min}, @var{sigma_max}, @var{w}] =} svplot (@var{sys}, @var{w}) ## @deftypefnx{Function File} {[@var{sigma_min}, @var{sigma_max}, @var{w}] =} svplot (@var{sys}, @var{[]}, @var{ptype}) +## @deftypefnx{Function File} {[@var{sigma_min}, @var{sigma_max}, @var{w}] =} svplot (@var{sys}, @var{w}, @var{ptype}) ## If no output arguments are given, the singular value plot of a MIMO ## system is printed on the screen; ## otherwise, the singular values of the system data structure are This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <par...@us...> - 2009-08-28 19:22:58
|
Revision: 6166 http://octave.svn.sourceforge.net/octave/?rev=6166&view=rev Author: paramaniac Date: 2009-08-28 19:22:44 +0000 (Fri, 28 Aug 2009) Log Message: ----------- feedback: reworked, fix test Modified Paths: -------------- trunk/octave-forge/main/control/inst/feedback.m trunk/octave-forge/main/control/inst/svplot.m Modified: trunk/octave-forge/main/control/inst/feedback.m =================================================================== --- trunk/octave-forge/main/control/inst/feedback.m 2009-08-27 17:51:27 UTC (rev 6165) +++ trunk/octave-forge/main/control/inst/feedback.m 2009-08-28 19:22:44 UTC (rev 6166) @@ -60,33 +60,31 @@ ## Author: Lukas Reichlin ## Rewritten from scratch for better compatibility in July 2009 -## Version: 0.1.1 +## Version: 0.2 - # TODO: don't use varargin +function sys = feedback (_sys1, _sys2, varargin) -function sys = feedback (varargin) - if (nargin < 2 || nargin > 5) print_usage (); endif - ## Determine sys1 from input - if (isstruct (varargin{1})) - sys1 = varargin{1}; + ## Sanitize sys1 + if (isstruct (_sys1)) + sys1 = _sys1; sys1wasmatrix = 0; - elseif (ismatrix (varargin{1})) - sys1 = ss ([], [], [], varargin{1}); + elseif (ismatrix (_sys1)) + sys1 = ss ([], [], [], _sys1); sys1wasmatrix = 1; else error ("feedback: argument 1 (sys1) invalid"); endif - ## Determine sys2 from input - if (isstruct (varargin{2})) - sys2 = varargin{2}; + ## Sanitize sys2 + if (isstruct (_sys2)) + sys2 = _sys2; sys2wasmatrix = 0; - elseif (ismatrix (varargin{2})) - sys2 = ss ([], [], [], varargin{2}); + elseif (ismatrix (_sys2)) + sys2 = ss ([], [], [], _sys2); sys2wasmatrix = 1; else error ("feedback: argument 2 (sys2) invalid"); @@ -96,14 +94,14 @@ if (sys1wasmatrix) if (is_digital (sys2, 2) == 1) # -1 for mixed systems! t_sam = sysgettsam (sys2); - sys1 = ss ([], [], [], varargin{1}, t_sam); # sys1 = c2d (sys1, t_sam) doesn't work + sys1 = ss ([], [], [], _sys1, t_sam); # sys1 = c2d (sys1, t_sam) doesn't work endif endif if (sys2wasmatrix) if (is_digital (sys1, 2) == 1) t_sam = sysgettsam (sys1); - sys2 = ss ([], [], [], varargin{2}, t_sam); + sys2 = ss ([], [], [], _sys2, t_sam); endif endif @@ -111,22 +109,22 @@ fb_sign = -1; # Default value if (nargin == 3) - if (isreal (varargin{3})) - if (varargin{3} == +1) + if (isreal (varargin{1})) + if (varargin{1} == +1) fb_sign = +1; endif - if (varargin{3} != -1 && varargin{3} != +1) + if (varargin{1} != -1 && varargin{1} != +1) error ("feedback: argument 3 (sign) invalid"); endif endif endif if (nargin == 5) - if (isreal (varargin{5})) - if (varargin{5} == +1) + if (isreal (varargin{3})) + if (varargin{3} == +1) fb_sign = +1; endif - if (varargin{5} != -1 && varargin{3} != +1) + if (varargin{3} != -1 && varargin{3} != +1) error ("feedback: argument 5 (sign) invalid"); endif endif @@ -138,6 +136,9 @@ ## Get connection lists feedin and feedout + feedin = zeros (1, n_in_1); + feedout = zeros (1, n_out_1); + for k = 1 : n_in_1 feedin(k) = k; # Default value endfor @@ -147,14 +148,14 @@ endfor if (nargin == 4 || nargin == 5) - if (isvector (varargin{3})) - feedin = varargin{3}; + if (isvector (varargin{1})) + feedin = varargin{1}; else error ("feedback: argument 3 (feedin) invalid"); endif - if (isvector (varargin{4})) - feedin = varargin{4}; + if (isvector (varargin{2})) + feedin = varargin{2}; else error ("feedback: argument 4 (feedout) invalid"); endif @@ -279,97 +280,23 @@ endfunction -%!shared A, B, C, D, F_exp, G_exp, H_exp, J_exp, F, G, H, J, sys, sysc, M, N, outsys, zer, pol, k, zer_exp, pol_exp, k_exp +%!shared sys1, sys2, sys3, sys4, sys5, sys6, sysexpa, sysexpb +%! G = ss ([0], [1], [1], [0]); +%! H = ss ([], [], [], [1]); %! -%! ## Given Open Loop State Space Matrices +%! sys1 = feedback (G, H); +%! sys2 = feedback (G, 1, -1); +%! sys3 = feedback (G, H, 1, 1, -1); +%! sysexpa = ss ([-1], [1], [1], [0]); %! -%! A = [ -25 0 0 0 50 0 763 310.7 -27.93 -96.51 216.4 -61 ; -%! 0.261 -4 -0.002 0 0 0 0 0 0 0 0 0 ; -%! 618 7640 -3.07 0 0 338.4 17.19 -2247 5459 -2782 298.7 2849 ; -%! -0.384 5.89 0.003 -2.1 0 -0.21 -0.01822 0.9135 -0.9346 2.552 -0.0403 -1.761 ; -%! 0 0 0 0 0 0 30.52 12.43 -1.117 -3.861 8.658 -2.44 ; -%! 0 0 0 0 0 0 0.1735 -8.7 8.901 -24.31 0.3839 16.77 ; -%! 0 0 0 0 0 0 -788 -310.7 26.59 96.98 -166.4 61 ; -%! 0 0 0 0 0 0 5.22 -4 -7.945 0.2199 0 0 ; -%! 0 0 0 0 0 0 3.004 13.14 -31.54 13.91 -1.493 -12.56 ; -%! 0 0 0 0 0 0 -7.316 -12.38 30.69 -54.82 0.8061 31.01 ; -%! 0 0 0 0 0 0 -30.52 -12.43 0.6207 3.803 -8.658 2.44 ; -%! 0 0 0 0 0 0 -0.1735 8.7 -8.958 24.8 -0.3839 -16.77 ]; +%! sys4 = feedback (G, H, +1); +%! sys5 = feedback (G, 1, +1); +%! sys6 = feedback (G, H, 1, 1, +1); +%! sysexpb = ss ([1], [1], [1], [0]); %! -%! B = [ 0 0 ; -%! 0 0 ; -%! 0 0 ; -%! 0 0 ; -%! 0 0 ; -%! 0 0 ; -%! 0.006741 -9.319 ; -%! -0.0002757 -4.397 ; -%! 0.005862 0.01201 ; -%! 3.002e-06 33.54 ; -%! 0.002484 1.146 ; -%! 0.0002864 -9.934 ]; -%! -%! C = [ 0 0 1 0 0 0 0 0 0 0 0 0 ; -%! 0 0 0 1 0 0 0 0 0 0 0 0 ]; -%! -%! D = [ 0 0 ; -%! 0 0 ]; -%! -%! ## Expected Closed Loop State Space Matrices -%! -%! F_exp = [ -25 0 0 0 50 0 763 310.7 -27.93 -96.51 216.4 -61 ; -%! 0.261 -4 -0.002 0 0 0 0 0 0 0 0 0 ; -%! 618 7640 -3.07 0 0 338.4 17.19 -2247 5459 -2782 298.7 2849 ; -%! -0.384 5.89 0.003 -2.1 0 -0.21 -0.01822 0.9135 -0.9346 2.552 -0.0403 -1.761 ; -%! 0 0 0 0 0 0 30.52 12.43 -1.117 -3.861 8.658 -2.44 ; -%! 0 0 0 0 0 0 0.1735 -8.7 8.901 -24.31 0.3839 16.77 ; -%! 0 0 -0.006741 9.319 0 0 -788 -310.7 26.59 96.98 -166.4 61 ; -%! 0 0 0.0002757 4.397 0 0 5.22 -4 -7.945 0.2199 0 0 ; -%! 0 0 -0.005862 -0.01201 0 0 3.004 13.14 -31.54 13.91 -1.493 -12.56 ; -%! 0 0 -3.002e-06 -33.54 0 0 -7.316 -12.38 30.69 -54.82 0.8061 31.01 ; -%! 0 0 -0.002484 -1.146 0 0 -30.52 -12.43 0.6207 3.803 -8.658 2.44 ; -%! 0 0 -0.0002864 9.934 0 0 -0.1735 8.7 -8.958 24.8 -0.3839 -16.77 ]; -%! -%! G_exp = [ 0 0 ; -%! 0 0 ; -%! 0 0 ; -%! 0 0 ; -%! 0 0 ; -%! 0 0 ; -%! 0.006741 -9.319 ; -%! -0.0002757 -4.397 ; -%! 0.005862 0.01201 ; -%! 3.002e-06 33.54 ; -%! 0.002484 1.146 ; -%! 0.0002864 -9.934 ]; -%! -%! H_exp = [ 0 0 1 0 0 0 0 0 0 0 0 0 ; -%! 0 0 0 1 0 0 0 0 0 0 0 0 ]; -%! -%! J_exp = [ 0 0 ; -%! 0 0 ]; -%! -%! sys1 = ss(A, B, C, D); -%! sys = feedback(sys1, eye(2)); -%! [F, G, H, J] = sys2ss(sys); -%! -%! sysc = feedback(sys1, eye(2), [1, 2], [1, 2], -1); -%! -%! M = tf([2, 5, 1], [1, 2, 3]); -%! N = zp(-2, -10, 5); -%! outsys = feedback(M, N); -%! [zer, pol, k] = sys2zp(outsys); -%! -%! zer_exp = [ -2.280776406404418 ; -%! -0.219223593595584 ; -%! -9.999999999999996 ]; -%! pol_exp = [ -0.881474800310081 + 0.535367413587643i ; -%! -0.881474800310081 - 0.535367413587643i ; -%! -3.418868581198019 + 0.000000000000000i ]; -%! k_exp = 0.181818181818182; -%! -%!assert([F, G; H, J], [F_exp, G_exp; H_exp, J_exp]); -%!assert(sys, sysc) -%!assert(zer, zer_exp, 16*eps); # FIXME: why is a so high tol needed? -%!assert(pol, pol_exp, 16*eps); # FIXME: why is a so high tol needed? -%!assert(k, k_exp, 2*eps); +%!assert (sys1, sysexpa); +%!assert (sys2, sysexpa); +%!assert (sys3, sysexpa); +%!assert (sys4, sysexpb); +%!assert (sys5, sysexpb); +%!assert (sys6, sysexpb); Modified: trunk/octave-forge/main/control/inst/svplot.m =================================================================== --- trunk/octave-forge/main/control/inst/svplot.m 2009-08-27 17:51:27 UTC (rev 6165) +++ trunk/octave-forge/main/control/inst/svplot.m 2009-08-28 19:22:44 UTC (rev 6166) @@ -221,4 +221,3 @@ %!assert (sigma_min_obs, sigma_min_exp, 8*eps); # tolerance manually tweaked %!assert (sigma_max_obs, sigma_max_exp, 16*eps); # tolerance manually tweaked %!assert (w_obs, w_exp, 2*eps); - This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <par...@us...> - 2009-08-30 18:16:07
|
Revision: 6173 http://octave.svn.sourceforge.net/octave/?rev=6173&view=rev Author: paramaniac Date: 2009-08-30 18:15:54 +0000 (Sun, 30 Aug 2009) Log Message: ----------- minor changes in documentation Modified Paths: -------------- trunk/octave-forge/main/control/inst/buildretdiff.m trunk/octave-forge/main/control/inst/buildsens.m trunk/octave-forge/main/control/inst/sysfeedback.m Modified: trunk/octave-forge/main/control/inst/buildretdiff.m =================================================================== --- trunk/octave-forge/main/control/inst/buildretdiff.m 2009-08-29 23:17:25 UTC (rev 6172) +++ trunk/octave-forge/main/control/inst/buildretdiff.m 2009-08-30 18:15:54 UTC (rev 6173) @@ -15,7 +15,7 @@ ## -*- texinfo -*- ## @deftypefn{Function File} {@var{retsys} =} buildretdiff (@var{sys}) -## Build the return difference of a system. Useful in combination with svplot. +## Build the return difference of a system. ## ## @strong{Inputs} ## @table @var @@ -39,7 +39,7 @@ ## ## @end deftypefn -## Version: 0.1.1 +## Version: 0.1.2 function retsys = buildretdiff (sys) Modified: trunk/octave-forge/main/control/inst/buildsens.m =================================================================== --- trunk/octave-forge/main/control/inst/buildsens.m 2009-08-29 23:17:25 UTC (rev 6172) +++ trunk/octave-forge/main/control/inst/buildsens.m 2009-08-30 18:15:54 UTC (rev 6173) @@ -15,7 +15,7 @@ ## -*- texinfo -*- ## @deftypefn{Function File} {@var{retsys} =} buildsens (@var{sys}) -## Return the sensitivity of a system. Useful in combination with svplot. +## Return the sensitivity of a system. ## ## @strong{Inputs} ## @table @var @@ -61,7 +61,7 @@ ## ## @end deftypefn -## Version: 0.1.1 +## Version: 0.1.2 function retsys = buildsens (sys) Modified: trunk/octave-forge/main/control/inst/sysfeedback.m =================================================================== --- trunk/octave-forge/main/control/inst/sysfeedback.m 2009-08-29 23:17:25 UTC (rev 6172) +++ trunk/octave-forge/main/control/inst/sysfeedback.m 2009-08-30 18:15:54 UTC (rev 6173) @@ -17,7 +17,7 @@ ## @deftypefn{Function File} {@var{retsys} =} sysfeedback (@var{sys}) ## Returns the closed loop of a system. The feedback is negative. ## Works for MIMO systems as well as for systems with mixed continuous -## and discrete parts. Replacement for unitfeedback. +## and discrete parts. ## ## @strong{Inputs} ## @table @var @@ -72,9 +72,8 @@ ## @end deftypefn ## Author: Lukas Reichlin <luk...@sw...> -## Version: 0.1.1 +## Version: 0.1.2 - function retsys = sysfeedback (sys) if (nargin != 1) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <par...@us...> - 2009-08-31 18:44:50
|
Revision: 6189 http://octave.svn.sourceforge.net/octave/?rev=6189&view=rev Author: paramaniac Date: 2009-08-31 18:44:42 +0000 (Mon, 31 Aug 2009) Log Message: ----------- fix one typo, two simplifications Modified Paths: -------------- trunk/octave-forge/main/control/inst/buildsens.m trunk/octave-forge/main/control/inst/sysfeedback.m Modified: trunk/octave-forge/main/control/inst/buildsens.m =================================================================== --- trunk/octave-forge/main/control/inst/buildsens.m 2009-08-31 13:51:08 UTC (rev 6188) +++ trunk/octave-forge/main/control/inst/buildsens.m 2009-08-31 18:44:42 UTC (rev 6189) @@ -29,7 +29,7 @@ ## Sensitivity system data structure. ## @end table ## -## @seealso{svplot} +## @seealso{sysfeedback, buildretdiff} ## ## @example ## @group @@ -61,7 +61,7 @@ ## ## @end deftypefn -## Version: 0.2 +## Version: 0.2.1 function retsys = buildsens (sys) @@ -87,9 +87,9 @@ sysI = ss ([], [], [], eye (n_in), t_sam); - in_scl = (-1) * ones (1, n_in); + in_scl = (-1) * eye (n_in); - sys = sysscale (sys, [], diag (in_scl)); + sys = sysscale (sys, [], in_scl); retsys = feedback (sysI, sys, +1); Modified: trunk/octave-forge/main/control/inst/sysfeedback.m =================================================================== --- trunk/octave-forge/main/control/inst/sysfeedback.m 2009-08-31 13:51:08 UTC (rev 6188) +++ trunk/octave-forge/main/control/inst/sysfeedback.m 2009-08-31 18:44:42 UTC (rev 6189) @@ -72,7 +72,7 @@ ## @end deftypefn ## Author: Lukas Reichlin <luk...@sw...> -## Version: 0.2 +## Version: 0.2.1 function retsys = sysfeedback (sys) @@ -104,7 +104,7 @@ ## Connect outputs with inputs out_idx = 1 : n_out; - in_dup_idx = (n_in + 1) : (2 * n_in); + in_dup_idx = n_in + (1 : n_in); sys = sysconnect (sys, out_idx, in_dup_idx); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sla...@us...> - 2009-08-31 20:38:14
|
Revision: 6192 http://octave.svn.sourceforge.net/octave/?rev=6192&view=rev Author: slackydeb Date: 2009-08-31 20:38:06 +0000 (Mon, 31 Aug 2009) Log Message: ----------- Little style fixes. Modified Paths: -------------- trunk/octave-forge/main/control/inst/buildsens.m trunk/octave-forge/main/control/inst/sysfeedback.m Modified: trunk/octave-forge/main/control/inst/buildsens.m =================================================================== --- trunk/octave-forge/main/control/inst/buildsens.m 2009-08-31 19:24:34 UTC (rev 6191) +++ trunk/octave-forge/main/control/inst/buildsens.m 2009-08-31 20:38:06 UTC (rev 6192) @@ -61,7 +61,7 @@ ## ## @end deftypefn -## Version: 0.2.1 +## Version: 0.2.2 function retsys = buildsens (sys) @@ -87,7 +87,7 @@ sysI = ss ([], [], [], eye (n_in), t_sam); - in_scl = (-1) * eye (n_in); + in_scl = - eye (n_in); sys = sysscale (sys, [], in_scl); Modified: trunk/octave-forge/main/control/inst/sysfeedback.m =================================================================== --- trunk/octave-forge/main/control/inst/sysfeedback.m 2009-08-31 19:24:34 UTC (rev 6191) +++ trunk/octave-forge/main/control/inst/sysfeedback.m 2009-08-31 20:38:06 UTC (rev 6192) @@ -72,7 +72,7 @@ ## @end deftypefn ## Author: Lukas Reichlin <luk...@sw...> -## Version: 0.2.1 +## Version: 0.2.2 function retsys = sysfeedback (sys) @@ -97,7 +97,7 @@ ## Scale inputs in_scl = ones (1, n_in); - in_scl = horzcat (in_scl, (-1) * in_scl); + in_scl = horzcat (in_scl, - in_scl); sys = sysscale (sys, [], diag (in_scl)); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sla...@us...> - 2009-11-21 03:02:40
|
Revision: 6502 http://octave.svn.sourceforge.net/octave/?rev=6502&view=rev Author: slackydeb Date: 2009-11-21 03:02:32 +0000 (Sat, 21 Nov 2009) Log Message: ----------- control: little coding style fixes. References: http://sourceforge.net/mailarchive/message.php?msg_name=1253478002.4430.37.camel%40sh-t400 Modified Paths: -------------- trunk/octave-forge/main/control/inst/ctrb.m trunk/octave-forge/main/control/inst/obsv.m Modified: trunk/octave-forge/main/control/inst/ctrb.m =================================================================== --- trunk/octave-forge/main/control/inst/ctrb.m 2009-11-21 02:54:48 UTC (rev 6501) +++ trunk/octave-forge/main/control/inst/ctrb.m 2009-11-21 03:02:32 UTC (rev 6502) @@ -71,4 +71,4 @@ endfunction -%!assert (ctrb ([1 0; 0 -0.5], [8; 8]), [8 8; 8 -4]); +%!assert (ctrb ([1, 0; 0, -0.5], [8; 8]), [8, 8; 8, -4]); Modified: trunk/octave-forge/main/control/inst/obsv.m =================================================================== --- trunk/octave-forge/main/control/inst/obsv.m 2009-11-21 02:54:48 UTC (rev 6501) +++ trunk/octave-forge/main/control/inst/obsv.m 2009-11-21 03:02:32 UTC (rev 6502) @@ -70,4 +70,4 @@ endfunction -%!assert (obsv ([1 0; 0 -0.5], [8 8]), [8 8; 8 -4]); +%!assert (obsv ([1, 0; 0, -0.5], [8, 8]), [8, 8; 8, -4]); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <par...@us...> - 2010-04-05 09:11:38
|
Revision: 7156 http://octave.svn.sourceforge.net/octave/?rev=7156&view=rev Author: paramaniac Date: 2010-04-05 09:11:31 +0000 (Mon, 05 Apr 2010) Log Message: ----------- control: add two FIXME comments Modified Paths: -------------- trunk/octave-forge/main/control/inst/@lti/sminreal.m trunk/octave-forge/main/control/inst/@ss/__minreal__.m Modified: trunk/octave-forge/main/control/inst/@lti/sminreal.m =================================================================== --- trunk/octave-forge/main/control/inst/@lti/sminreal.m 2010-04-05 00:56:37 UTC (rev 7155) +++ trunk/octave-forge/main/control/inst/@lti/sminreal.m 2010-04-05 09:11:31 UTC (rev 7156) @@ -43,4 +43,16 @@ sys = __sysprune__ (sys, ":", ":", st_idx); -endfunction \ No newline at end of file +endfunction + + +## FIXME: algorithm returns wrong result for the example below +## +## P = ss (-2, 3, 4, 5) +## C = inv (P) +## L = P * C +## Ls = sminreal (L) +## bode (Ls) +## +## Obviously, both magnitude and phase should be straight lines at 0 dB and 0 deg +## In this case, sminreal shouldn't remove any states of L \ No newline at end of file Modified: trunk/octave-forge/main/control/inst/@ss/__minreal__.m =================================================================== --- trunk/octave-forge/main/control/inst/@ss/__minreal__.m 2010-04-05 00:56:37 UTC (rev 7155) +++ trunk/octave-forge/main/control/inst/@ss/__minreal__.m 2010-04-05 09:11:31 UTC (rev 7156) @@ -68,4 +68,14 @@ retsys = ss (A, B, C, sys.d); retsys.lti = sys.lti; # retain i/o names and tsam -endfunction \ No newline at end of file +endfunction + + +## FIXME: algorithm fails for the example below +## +## P = ss (-2, 3, 4, 5) +## C = inv (P) +## L = P * C +## Lm = minreal (L) +## +## Lm.d should be 1 \ No newline at end of file This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <par...@us...> - 2010-04-28 21:46:35
|
Revision: 7277 http://octave.svn.sourceforge.net/octave/?rev=7277&view=rev Author: paramaniac Date: 2010-04-28 21:46:29 +0000 (Wed, 28 Apr 2010) Log Message: ----------- control: simplify expressions Modified Paths: -------------- trunk/octave-forge/main/control/inst/@lti/norm.m trunk/octave-forge/main/control/inst/covar.m trunk/octave-forge/main/control/inst/h2syn.m Modified: trunk/octave-forge/main/control/inst/@lti/norm.m =================================================================== --- trunk/octave-forge/main/control/inst/@lti/norm.m 2010-04-28 16:00:12 UTC (rev 7276) +++ trunk/octave-forge/main/control/inst/@lti/norm.m 2010-04-28 21:46:29 UTC (rev 7277) @@ -68,7 +68,7 @@ [a, b, c, d] = ssdata (sys); discrete = ! isct (sys); - if (! discrete && ! all (all (d == 0))) # continuous and non-zero feedthrough + if (! discrete && any (any (d))) # continuous and non-zero feedthrough gain = inf; else [gain, iwarn] = slab13bd (a, b, c, d, discrete); Modified: trunk/octave-forge/main/control/inst/covar.m =================================================================== --- trunk/octave-forge/main/control/inst/covar.m 2010-04-28 16:00:12 UTC (rev 7276) +++ trunk/octave-forge/main/control/inst/covar.m 2010-04-28 21:46:29 UTC (rev 7277) @@ -43,7 +43,7 @@ [a, b, c, d] = ssdata (sys); if (isct (sys)) - if (! all (all (d == 0))) + if (any (any (d))) error ("covar: system is not strictly proper"); endif Modified: trunk/octave-forge/main/control/inst/h2syn.m =================================================================== --- trunk/octave-forge/main/control/inst/h2syn.m 2010-04-28 16:00:12 UTC (rev 7276) +++ trunk/octave-forge/main/control/inst/h2syn.m 2010-04-28 21:46:29 UTC (rev 7277) @@ -103,7 +103,7 @@ d11 = d(1:p1, 1:m1); - if (isct (P) && ! all (all (d11 == 0))) + if (isct (P) && any (any (d11))) warning ("h2syn: setting matrice D11 to zero"); d(1:p1, 1:m1) = 0; endif This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <par...@us...> - 2010-05-02 17:47:49
|
Revision: 7283 http://octave.svn.sourceforge.net/octave/?rev=7283&view=rev Author: paramaniac Date: 2010-05-02 17:47:43 +0000 (Sun, 02 May 2010) Log Message: ----------- control: add ctrbf.m and obsvf.m (thanks to Benjamin Fernandez) Added Paths: ----------- trunk/octave-forge/main/control/inst/ctrbf.m trunk/octave-forge/main/control/inst/obsvf.m Added: trunk/octave-forge/main/control/inst/ctrbf.m =================================================================== --- trunk/octave-forge/main/control/inst/ctrbf.m (rev 0) +++ trunk/octave-forge/main/control/inst/ctrbf.m 2010-05-02 17:47:43 UTC (rev 7283) @@ -0,0 +1,76 @@ +## Copyright (C) 2010 Benjamin Fernandez <ma...@be...> +## +## This program 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 2 of the License, or +## (at your option) any later version. +## +## This program 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 Octave; see the file COPYING. If not, see +## <http://www.gnu.org/licenses/>. + +## -*- texinfo -*- +## @deftypefn{Function File} {[@var{Abar}, @var{Bbar}, @var{Cbar}, @var{T}, @var{K}] =} ctrbf (@var{A}, @var{B}, @var{C}) +## @deftypefnx{Function File} {[@var{Abar}, @var{Bbar}, @var{Cbar}, @var{T}, @var{K}] =} ctrbf (@var{A}, @var{B}, @var{C}, @var{TOL}) +## If Co=ctrb(A,B) has rank r <= n = SIZE(A,1), then there is a +## similarity transformation Tc such that Tc = [t1 t2] where t1 +## is the controlable subspace and t2 is orthogonal to t1 +## +## @example +## @group +## Abar = Tc \ A * Tc , Bbar = Tc \ B , Cbar = C * Tc +## @end group +## @end example +## +## and the transformed system has the form +## +## @example +## @group +## | Ac A12| | Bc | +## Abar = |----------|, Bbar = | ---|, Cbar = [Cc | Cnc]. +## | 0 Anc| | 0 | +## @end group +## @end example +## +## where (Ac,Bc) is controllable, and Cc(sI-Ac)^(-1)Bc = C(sI-A)^(-1)B. +## and the system is stabilizable if Anc has no eigenvalues in +## the right half plane. The last output K is a vector of length n +## containing the number of controllable states. +## @end deftypefn + +## Author: Benjamin Fernandez <benjas@benjas-laptop> +## Created: 2010-04-30 + +function [Abar, Bbar, Cbar, T, K] = ctrbf (A, B, C, TOL) + + if (nargin<3 || nargin>4) + print_usage (); + end + + n = length (A); + + if (nargin==3) + TOL = n*norm (A,1)*eps; + end + + Co = ctrb (A, B); + [nrc, ncc] = size (Co); + rco = rank (Co,TOL); + lr = nrc-rco; + [U, S, V] = svd (Co); + K = U(:, 1:rco); # Basis column space + T = U; # [B orth(B)] + Abar = T\A*T; + Bbar = T\B; + Cbar = C*T; + Anc = Abar(n-(n-rco)+1:n, n-(n-rco)+1:n); + Ac = Abar(1:rco, 1:rco); + Bc = Bbar(1:rco, :); + Cc = Cbar(:, 1:rco); + +endfunction \ No newline at end of file Added: trunk/octave-forge/main/control/inst/obsvf.m =================================================================== --- trunk/octave-forge/main/control/inst/obsvf.m (rev 0) +++ trunk/octave-forge/main/control/inst/obsvf.m 2010-05-02 17:47:43 UTC (rev 7283) @@ -0,0 +1,76 @@ +## Copyright (C) 2010 Benjamin Fernandez +## +## This program 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 2 of the License, or +## (at your option) any later version. +## +## This program 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 Octave; see the file COPYING. If not, see +## <http://www.gnu.org/licenses/>. + +## -*- texinfo -*- +## @deftypefn{Function File} {[@var{Abar}, @var{Bbar}, @var{Cbar}, @var{T}, @var{K}] =} obsvf (@var{A}, @var{B}, @var{C}) +## @deftypefnx{Function File} {[@var{Abar}, @var{Bbar}, @var{Cbar}, @var{T}, @var{K}] =} obsvf (@var{A}, @var{B}, @var{C}, @var{TOL}) +## If Ob=obsv(A,C) has rank r <= n = SIZE(A,1), then there is a +## similarity transformation Tc such that To = [t1;t2] where t1 is c +## and t2 is orthogonal to t1 +## +## @example +## @group +## Abar = To \ A * To , Bbar = To \ B , Cbar = C * To +## @end group +## @end example +## +## and the transformed system has the form +## +## @example +## @group +## | Ao 0 | | Bo | +## Abar = |----------|, Bbar = | --- |, Cbar = [Co | 0 ]. +## | A21 Ano| | Bno | +## @end group +## @end example +## +## where (Ao,Bo) is observable, and Co(sI-Ao)^(-1)Bo = C(sI-A)^(-1)B. And +## system is detectable if Ano has no eigenvalues in the right +## half plane. The last output K is a vector of length n containing the +## number of observable states. +## @end deftypefn + +## Author: Benjamin Fernandez <benjas@benjas-laptop> +## Created: 2010-05-02 + +function [Abar, Bbar, Cbar, T, K] = obsvf (A, B, C, TOL) + + if (nargin<3 || nargin>4) + print_usage (); + end + + n = length (A); + + if (nargin==3) + TOL = n*norm (A, 1)*eps; + end + + Ob = obsv (A, C); + [nro, nco] = size (Ob); + rob = rank (Ob); + lr = nco-rob; + [U, S, V] = svd (Ob); + K = V(:, 1:rob); # Basis raw space + T = V; # [c;orth(c)]; + Abar = T\A*T; + Bbar = T\B; + Cbar = C*T; + Ano = Abar(n-(n-rob)+1:n, n-(n-rob)+1:n) + Ao = Abar(1:rob, 1:rob); + Bo = Bbar(1:rob, :); + Co = Cbar(:, 1:rob); + +endfunction \ No newline at end of file This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <par...@us...> - 2010-05-11 20:51:16
|
Revision: 7295 http://octave.svn.sourceforge.net/octave/?rev=7295&view=rev Author: paramaniac Date: 2010-05-11 20:51:09 +0000 (Tue, 11 May 2010) Log Message: ----------- control: remove cruft Modified Paths: -------------- trunk/octave-forge/main/control/inst/ctrbf.m trunk/octave-forge/main/control/inst/obsvf.m Modified: trunk/octave-forge/main/control/inst/ctrbf.m =================================================================== --- trunk/octave-forge/main/control/inst/ctrbf.m 2010-05-10 20:17:29 UTC (rev 7294) +++ trunk/octave-forge/main/control/inst/ctrbf.m 2010-05-11 20:51:09 UTC (rev 7295) @@ -48,29 +48,23 @@ function [Abar, Bbar, Cbar, T, K] = ctrbf (A, B, C, TOL) - if (nargin<3 || nargin>4) + if (nargin < 3 || nargin > 4) print_usage (); - end + endif - n = length (A); + if (nargin == 3) + TOL = length (A) * norm (A,1) * eps; + endif - if (nargin==3) - TOL = n*norm (A,1)*eps; - end - Co = ctrb (A, B); [nrc, ncc] = size (Co); - rco = rank (Co,TOL); - lr = nrc-rco; + rco = rank (Co, TOL); + lr = nrc - rco; [U, S, V] = svd (Co); K = U(:, 1:rco); # Basis column space - T = U; # [B orth(B)] - Abar = T\A*T; - Bbar = T\B; - Cbar = C*T; - Anc = Abar(n-(n-rco)+1:n, n-(n-rco)+1:n); - Ac = Abar(1:rco, 1:rco); - Bc = Bbar(1:rco, :); - Cc = Cbar(:, 1:rco); - + T = U; # [B orth(B)] + Abar = T \ A * T; + Bbar = T \ B; + Cbar = C * T; + endfunction \ No newline at end of file Modified: trunk/octave-forge/main/control/inst/obsvf.m =================================================================== --- trunk/octave-forge/main/control/inst/obsvf.m 2010-05-10 20:17:29 UTC (rev 7294) +++ trunk/octave-forge/main/control/inst/obsvf.m 2010-05-11 20:51:09 UTC (rev 7295) @@ -48,29 +48,23 @@ function [Abar, Bbar, Cbar, T, K] = obsvf (A, B, C, TOL) - if (nargin<3 || nargin>4) + if (nargin < 3 || nargin > 4) print_usage (); - end + endif - n = length (A); + if (nargin == 3) + TOL = length (A) * norm (A, 1) * eps; + endif - if (nargin==3) - TOL = n*norm (A, 1)*eps; - end - Ob = obsv (A, C); [nro, nco] = size (Ob); rob = rank (Ob); - lr = nco-rob; + lr = nco - rob; [U, S, V] = svd (Ob); K = V(:, 1:rob); # Basis raw space - T = V; # [c;orth(c)]; - Abar = T\A*T; - Bbar = T\B; - Cbar = C*T; - Ano = Abar(n-(n-rob)+1:n, n-(n-rob)+1:n) - Ao = Abar(1:rob, 1:rob); - Bo = Bbar(1:rob, :); - Co = Cbar(:, 1:rob); + T = V; # [c; orth(c)]; + Abar = T \ A * T; + Bbar = T \ B; + Cbar = C * T; endfunction \ No newline at end of file This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <par...@us...> - 2010-05-14 09:50:52
|
Revision: 7303 http://octave.svn.sourceforge.net/octave/?rev=7303&view=rev Author: paramaniac Date: 2010-05-14 09:50:45 +0000 (Fri, 14 May 2010) Log Message: ----------- control: add warnings Modified Paths: -------------- trunk/octave-forge/main/control/inst/dlyap.m trunk/octave-forge/main/control/inst/lyap.m Modified: trunk/octave-forge/main/control/inst/dlyap.m =================================================================== --- trunk/octave-forge/main/control/inst/dlyap.m 2010-05-14 07:33:50 UTC (rev 7302) +++ trunk/octave-forge/main/control/inst/dlyap.m 2010-05-14 09:50:45 UTC (rev 7303) @@ -59,7 +59,11 @@ [x, scale] = slsb03md (a, -b, true); # AXA' - X = -B - x /= scale; # 0 < scale <= 1 + ## x /= scale; # 0 < scale <= 1 + + if (scale < 1) + warning ("dlyap: solution scaled by %g to prevent overflow", scale); + endif case 3 # Sylvester equation @@ -113,8 +117,12 @@ [x, scale] = slsg03ad (a, e, -b, true); # AXA' - EXE' = -B - x /= scale; # 0 < scale <= 1 + ## x /= scale; # 0 < scale <= 1 + if (scale < 1) + warning ("dlyap: solution scaled by %g to prevent overflow", scale); + endif + otherwise print_usage (); Modified: trunk/octave-forge/main/control/inst/lyap.m =================================================================== --- trunk/octave-forge/main/control/inst/lyap.m 2010-05-14 07:33:50 UTC (rev 7302) +++ trunk/octave-forge/main/control/inst/lyap.m 2010-05-14 09:50:45 UTC (rev 7303) @@ -59,7 +59,11 @@ [x, scale] = slsb03md (a, -b, false); # AX + XA' = -B - x /= scale; # 0 < scale <= 1 + ## x /= scale; # 0 < scale <= 1 + + if (scale < 1) + warning ("lyap: solution scaled by %g to prevent overflow", scale); + endif case 3 # Sylvester equation @@ -113,8 +117,12 @@ [x, scale] = slsg03ad (a, e, -b, false); # AXE' + EXA' = -B - x /= scale; # 0 < scale <= 1 + ## x /= scale; # 0 < scale <= 1 + if (scale < 1) + warning ("lyap: solution scaled by %g to prevent overflow", scale); + endif + otherwise print_usage (); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <par...@us...> - 2010-08-10 16:11:52
|
Revision: 7503 http://octave.svn.sourceforge.net/octave/?rev=7503&view=rev Author: paramaniac Date: 2010-08-10 16:11:46 +0000 (Tue, 10 Aug 2010) Log Message: ----------- control: fix some functions because issquare doesn't return the size any more Modified Paths: -------------- trunk/octave-forge/main/control/inst/care.m trunk/octave-forge/main/control/inst/dare.m trunk/octave-forge/main/control/inst/dlyap.m trunk/octave-forge/main/control/inst/lyap.m Modified: trunk/octave-forge/main/control/inst/care.m =================================================================== --- trunk/octave-forge/main/control/inst/care.m 2010-08-06 08:53:34 UTC (rev 7502) +++ trunk/octave-forge/main/control/inst/care.m 2010-08-10 16:11:46 UTC (rev 7503) @@ -54,28 +54,25 @@ print_usage (); endif - asize = issquare (a); [brows, bcols] = size (b); - qsize = issquare (q); - rsize = issquare (r); - if (! asize) + if (! issquare (a)) error ("care: a is not square"); endif - if (! qsize) + if (! issquare (q)) error ("care: q is not square"); endif - if (! rsize) + if (! issquare (r)) error ("care: r is not square"); endif - if (asize != brows) + if (rows (a) != brows) error ("care: a, b are not conformable"); endif - if (rsize != bcols) + if (columns (r) != bcols) error ("care: b, r are not conformable"); endif Modified: trunk/octave-forge/main/control/inst/dare.m =================================================================== --- trunk/octave-forge/main/control/inst/dare.m 2010-08-06 08:53:34 UTC (rev 7502) +++ trunk/octave-forge/main/control/inst/dare.m 2010-08-10 16:11:46 UTC (rev 7503) @@ -54,28 +54,25 @@ print_usage (); endif - asize = issquare (a); [brows, bcols] = size (b); - qsize = issquare (q); - rsize = issquare (r); - if (! asize) + if (! issquare (a)) error ("dare: a is not square"); endif - if (! qsize) + if (! issquare (q)) error ("dare: q is not square"); endif - if (! rsize) + if (! issquare (r)) error ("dare: r is not square"); endif - if (asize != brows) + if (rows (a) != brows) error ("dare: a, b are not conformable"); endif - if (rsize != bcols) + if (columns (r) != bcols) error ("dare: b, r are not conformable"); endif Modified: trunk/octave-forge/main/control/inst/dlyap.m =================================================================== --- trunk/octave-forge/main/control/inst/dlyap.m 2010-08-06 08:53:34 UTC (rev 7502) +++ trunk/octave-forge/main/control/inst/dlyap.m 2010-08-10 16:11:46 UTC (rev 7503) @@ -42,14 +42,14 @@ switch (nargin) case 2 # Lyapunov equation - na = issquare (a); - nb = issquare (b); + na = rows (a); + nb = rows (b); - if (! na) + if (! issquare (a)) error ("lyap: a must be square"); endif - if (! nb) + if (! issquare (b)) error ("lyap: b must be square") endif @@ -67,15 +67,15 @@ case 3 # Sylvester equation - n = issquare (a); - m = issquare (b); + n = rows (a); + m = rows (b); [crows, ccols] = size (c); - if (! n) + if (! issquare (a)) error ("dlyap: a must be square"); endif - if (! m) + if (! issquare (b)) error ("dlyap: b must be square"); endif @@ -91,19 +91,19 @@ print_usage (); endif - na = issquare (a); - nb = issquare (b); - ne = issquare (e); + na = rows (a); + nb = rows (b); + ne = rows (e); - if (! na) + if (! issquare (a)) error ("lyap: a must be square"); endif - if (! nb) + if (! issquare (b)) error ("lyap: b must be square"); endif - if (! ne) + if (! issquare (e)) error ("lyap: e must be square"); endif Modified: trunk/octave-forge/main/control/inst/lyap.m =================================================================== --- trunk/octave-forge/main/control/inst/lyap.m 2010-08-06 08:53:34 UTC (rev 7502) +++ trunk/octave-forge/main/control/inst/lyap.m 2010-08-10 16:11:46 UTC (rev 7503) @@ -42,14 +42,14 @@ switch (nargin) case 2 # Lyapunov equation - na = issquare (a); - nb = issquare (b); + na = rows (a); + nb = rows (b); - if (! na) + if (! issquare (a)) error ("lyap: a must be square"); endif - if (! nb) + if (! issquare (b)) error ("lyap: b must be square") endif @@ -67,15 +67,15 @@ case 3 # Sylvester equation - n = issquare (a); - m = issquare (b); + n = rows (a); + m = rows (b); [crows, ccols] = size (c); - if (! n) + if (! issquare (a)) error ("lyap: a must be square"); endif - if (! m) + if (! issquare (b)) error ("lyap: b must be square"); endif @@ -91,19 +91,19 @@ print_usage (); endif - na = issquare (a); - nb = issquare (b); - ne = issquare (e); + na = rows (a); + nb = rows (b); + ne = rows (e); - if (! na) + if (! issquare (a)) error ("lyap: a must be square"); endif - if (! nb) + if (! issquare (b)) error ("lyap: b must be square"); endif - if (! ne) + if (! issquare (e)) error ("lyap: e must be square"); endif This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <par...@us...> - 2010-08-10 16:21:35
|
Revision: 7504 http://octave.svn.sourceforge.net/octave/?rev=7504&view=rev Author: paramaniac Date: 2010-08-10 16:21:27 +0000 (Tue, 10 Aug 2010) Log Message: ----------- control: fix even more functions because issquare doesn't return the size any more Modified Paths: -------------- trunk/octave-forge/main/control/inst/isctrb.m trunk/octave-forge/main/control/inst/isstabilizable.m Modified: trunk/octave-forge/main/control/inst/isctrb.m =================================================================== --- trunk/octave-forge/main/control/inst/isctrb.m 2010-08-10 16:11:46 UTC (rev 7503) +++ trunk/octave-forge/main/control/inst/isctrb.m 2010-08-10 16:21:27 UTC (rev 7504) @@ -107,10 +107,10 @@ endif ## check dimensions compatibility - n = issquare (a); + n = rows (a); [nr, nc] = size (b); - if (n == 0 || n != nr || nc == 0) + if (n == 0 || n != nr || nc == 0 || issquare (a)) warning ("isctrb: a(%dx%d), b(%dx%d)", rows(a), columns(a), nr, nc); retval = 0; Modified: trunk/octave-forge/main/control/inst/isstabilizable.m =================================================================== --- trunk/octave-forge/main/control/inst/isstabilizable.m 2010-08-10 16:11:46 UTC (rev 7503) +++ trunk/octave-forge/main/control/inst/isstabilizable.m 2010-08-10 16:21:27 UTC (rev 7504) @@ -71,10 +71,10 @@ endif ## Checking dimensions - n = issquare (a); + n = rows (a); [nr, m] = size (b); - if (! n) + if (! issquare (a)) error ("isstabilizable: a must be square"); endif This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <par...@us...> - 2010-08-17 11:56:33
|
Revision: 7547 http://octave.svn.sourceforge.net/octave/?rev=7547&view=rev Author: paramaniac Date: 2010-08-17 11:56:27 +0000 (Tue, 17 Aug 2010) Log Message: ----------- control: add two warnings Modified Paths: -------------- trunk/octave-forge/main/control/inst/@lti/sminreal.m trunk/octave-forge/main/control/inst/@ss/__minreal__.m Modified: trunk/octave-forge/main/control/inst/@lti/sminreal.m =================================================================== --- trunk/octave-forge/main/control/inst/@lti/sminreal.m 2010-08-16 20:38:20 UTC (rev 7546) +++ trunk/octave-forge/main/control/inst/@lti/sminreal.m 2010-08-17 11:56:27 UTC (rev 7547) @@ -43,6 +43,8 @@ sys = __sysprune__ (sys, ":", ":", st_idx); + warning ("sminreal: use result with caution"); + endfunction Modified: trunk/octave-forge/main/control/inst/@ss/__minreal__.m =================================================================== --- trunk/octave-forge/main/control/inst/@ss/__minreal__.m 2010-08-16 20:38:20 UTC (rev 7546) +++ trunk/octave-forge/main/control/inst/@ss/__minreal__.m 2010-08-17 11:56:27 UTC (rev 7547) @@ -68,6 +68,8 @@ retsys = ss (A, B, C, sys.d); retsys.lti = sys.lti; # retain i/o names and tsam + warning ("ss: minreal: use result with caution"); + endfunction This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |