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. |