Mercurial > hg > octave-nkf
view scripts/control/dlqg.m @ 3381:69b167451491
[project @ 1999-12-15 20:48:10 by jwe]
author | jwe |
---|---|
date | Wed, 15 Dec 1999 20:48:45 +0000 |
parents | f7e4a95916f2 |
children | 10f21f7ccc7f |
line wrap: on
line source
## Copyright (C) 1996 Auburn University. All Rights Reserved ## ## This file is part of Octave. ## ## Octave 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, or (at your option) any ## later version. ## ## Octave 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, write to the Free ## Software Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA. ## O B S O L E T E * * * D O N O T U S E! ## ## Use lqg instead. ## ## function [K,Q,P,Ee,Er] = dlqg(A,B,C,G,Sigw,Sigv,Q,R) ## function [K,Q,P,Ee,Er] = dlqg(Sys,Sigw,Sigv,Q,R) ## ## design a discrete-time linear quadratic gaussian optimal controller ## for the system ## ## x(k+1) = A x(k) + B u(k) + G w(k) [w]=N(0,[Sigw 0 ]) ## y(k) = C x(k) + v(k) [v] ( 0 Sigv ]) ## ## Outputs: ## K: system data structure format LQG optimal controller ## P: Solution of control (state feedback) algebraic Riccati equation ## Q: Solution of estimation algebraic Riccati equation ## Ee: estimator poles ## Es: controller poles ## inputs: ## A,B,C,G, or Sys: state space representation of system. ## Sigw, Sigv: covariance matrices of independent Gaussian noise processes ## (as above) ## Q, R: state, control weighting matrices for dlqr call respectively. ## ## See also: lqg, dlqe, dlqr function [K,Q,P,Ee,Er] = dlqg(A,B,C,G,Sigw, Sigv,Q,R) ## Written by A. S. Hodel August 1995 warning("dlqg: obsolete. use lqg instead (system data structure format)"); if (nargin == 5) ## system data structure format ## check that it really is system data structure if(! is_struct(A) ) error("dlqg: 5 arguments, first argument is not a system data structure structure") endif sys = sysupdate(sys,"ss"); # make sure in proper form [ncstates,ndstates,nin,nout] = sysdimensions(sys); if(ndstates == -1) error("this message should never appear: bad system dimensions"); endif if(ncstates) error("dlqg: system has continuous-time states (try lqg?)") elseif(ndstates < 1) error("dlqg: system has no discrete time states") elseif(nin <= columns(Sigw)) error(["dlqg: ",num2str(nin)," inputs provided, noise dimension is ", ... num2str(columns(Sigw))]) elseif(nout != columns(Sigv)) error(["dlqg: number of outputs (",num2str(nout),") incompatible with ", ... "dimension of Sigv (",num2str(columns(Sigv)),")"]) endif ## put parameters into correct variables R = Sigw; Q = G; Sigv = C; Sigw = B; [A,B,C,D] = sys2ss(Sys) [n,m] = size(B) m1 = columns(Sigw); m2 = m1+1; G = B(:,1:m1); B = B(:,m2:m); elseif (nargin == 8) ## state-space format m = columns(B); m1 = columns(G); p = rows(C); n = abcddim(A,B,C,zeros(p,m)); n1 = abcddim(A,G,C,zeros(p,m1)); if( (n == -1) || (n1 == -1)) error("dlqg: A,B,C,G incompatibly dimensioned"); elseif(p != columns(Sigv)) error("dlqg: C, Sigv incompatibly dimensioned"); elseif(m1 != columns(Sigw)) error("dlqg: G, Sigw incompatibly dimensioned"); endif else error("dlqg: illegal number of arguments") endif if (! (is_square(Sigw) && is_square(Sigv) ) ) error("dlqg: Sigw, Sigv must be square"); endif ## now we can just do the design; call dlqr and dlqe, since all matrices ## are not given in Cholesky factor form (as in h2syn case) [Ks, P, Er] = dlqr(A,B,Q,R); [Ke, Q, jnk, Ee] = dlqe(A,G,C,Sigw,Sigv); Ac = A - Ke*C - B*Ks; Bc = Ke; Cc = -Ks; Dc = zeros(rows(Cc),columns(Bc)); K = ss2sys(Ac,Bc,Cc,Dc,1); disp("HODEL: need to add names to this guy!") endfunction