annotate scripts/control/dre.m @ 3284:f7e4a95916f2

[project @ 1999-10-13 21:37:04 by jwe]
author jwe
date Wed, 13 Oct 1999 21:37:40 +0000
parents 6dd06d525de6
children 69b167451491
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
3279
6dd06d525de6 [project @ 1999-10-12 16:52:40 by jwe]
jwe
parents: 3238
diff changeset
1 # Copyright (C) 1998 Auburn University. All Rights Reserved
3236
98e15955107e [project @ 1999-03-05 07:17:10 by jwe]
jwe
parents:
diff changeset
2 #
98e15955107e [project @ 1999-03-05 07:17:10 by jwe]
jwe
parents:
diff changeset
3 # This file is part of Octave.
98e15955107e [project @ 1999-03-05 07:17:10 by jwe]
jwe
parents:
diff changeset
4 #
98e15955107e [project @ 1999-03-05 07:17:10 by jwe]
jwe
parents:
diff changeset
5 # Octave is free software; you can redistribute it and/or modify it
98e15955107e [project @ 1999-03-05 07:17:10 by jwe]
jwe
parents:
diff changeset
6 # under the terms of the GNU General Public License as published by the
98e15955107e [project @ 1999-03-05 07:17:10 by jwe]
jwe
parents:
diff changeset
7 # Free Software Foundation; either version 2, or (at your option) any
98e15955107e [project @ 1999-03-05 07:17:10 by jwe]
jwe
parents:
diff changeset
8 # later version.
98e15955107e [project @ 1999-03-05 07:17:10 by jwe]
jwe
parents:
diff changeset
9 #
98e15955107e [project @ 1999-03-05 07:17:10 by jwe]
jwe
parents:
diff changeset
10 # Octave is distributed in the hope that it will be useful, but WITHOUT
98e15955107e [project @ 1999-03-05 07:17:10 by jwe]
jwe
parents:
diff changeset
11 # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
98e15955107e [project @ 1999-03-05 07:17:10 by jwe]
jwe
parents:
diff changeset
12 # FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
98e15955107e [project @ 1999-03-05 07:17:10 by jwe]
jwe
parents:
diff changeset
13 # for more details.
98e15955107e [project @ 1999-03-05 07:17:10 by jwe]
jwe
parents:
diff changeset
14 #
98e15955107e [project @ 1999-03-05 07:17:10 by jwe]
jwe
parents:
diff changeset
15 # You should have received a copy of the GNU General Public License
98e15955107e [project @ 1999-03-05 07:17:10 by jwe]
jwe
parents:
diff changeset
16 # along with Octave; see the file COPYING. If not, write to the Free
3284
f7e4a95916f2 [project @ 1999-10-13 21:37:04 by jwe]
jwe
parents: 3279
diff changeset
17 # Software Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA.
3236
98e15955107e [project @ 1999-03-05 07:17:10 by jwe]
jwe
parents:
diff changeset
18
98e15955107e [project @ 1999-03-05 07:17:10 by jwe]
jwe
parents:
diff changeset
19 function [tvals,Plist] = dre(sys,Q,R,Qf,t0,tf,Ptol,maxits)
98e15955107e [project @ 1999-03-05 07:17:10 by jwe]
jwe
parents:
diff changeset
20 # [tvals,Plist] = dre(sys,Q,R,Qf,t0,tf{,Ptol,maxits});
98e15955107e [project @ 1999-03-05 07:17:10 by jwe]
jwe
parents:
diff changeset
21 # Solve the differential Riccati equation
98e15955107e [project @ 1999-03-05 07:17:10 by jwe]
jwe
parents:
diff changeset
22 # -d P/dt = A'P + P A - P B inv(R) B' P + Q
98e15955107e [project @ 1999-03-05 07:17:10 by jwe]
jwe
parents:
diff changeset
23 # P(tf) = Qf
98e15955107e [project @ 1999-03-05 07:17:10 by jwe]
jwe
parents:
diff changeset
24 # for the LTI system sys. Solution of standard LTI
98e15955107e [project @ 1999-03-05 07:17:10 by jwe]
jwe
parents:
diff changeset
25 # state feedback optimization
98e15955107e [project @ 1999-03-05 07:17:10 by jwe]
jwe
parents:
diff changeset
26 # min \int_{t_0}^{t_f} x' Q x + u' R u dt + x(t_f)' Qf x(t_f)
98e15955107e [project @ 1999-03-05 07:17:10 by jwe]
jwe
parents:
diff changeset
27 # optimal input is
98e15955107e [project @ 1999-03-05 07:17:10 by jwe]
jwe
parents:
diff changeset
28 # u = - inv(R) B' P(t) x
98e15955107e [project @ 1999-03-05 07:17:10 by jwe]
jwe
parents:
diff changeset
29 # inputs:
98e15955107e [project @ 1999-03-05 07:17:10 by jwe]
jwe
parents:
diff changeset
30 # sys: continuous time system data structure
98e15955107e [project @ 1999-03-05 07:17:10 by jwe]
jwe
parents:
diff changeset
31 # Q: state integral penalty
98e15955107e [project @ 1999-03-05 07:17:10 by jwe]
jwe
parents:
diff changeset
32 # R: input integral penalty
98e15955107e [project @ 1999-03-05 07:17:10 by jwe]
jwe
parents:
diff changeset
33 # Qf: state terminal penalty
98e15955107e [project @ 1999-03-05 07:17:10 by jwe]
jwe
parents:
diff changeset
34 # t0,tf: limits on the integral
98e15955107e [project @ 1999-03-05 07:17:10 by jwe]
jwe
parents:
diff changeset
35 # Ptol: tolerance (used to select time samples; see below); default = 0.1
98e15955107e [project @ 1999-03-05 07:17:10 by jwe]
jwe
parents:
diff changeset
36 # max number of refinement iterations (default=10)
98e15955107e [project @ 1999-03-05 07:17:10 by jwe]
jwe
parents:
diff changeset
37 # outputs:
98e15955107e [project @ 1999-03-05 07:17:10 by jwe]
jwe
parents:
diff changeset
38 # tvals: time values at which P(t) is computed
98e15955107e [project @ 1999-03-05 07:17:10 by jwe]
jwe
parents:
diff changeset
39 # Plist: list values of P(t); nth(Plist,ii) is P(tvals(ii)).
98e15955107e [project @ 1999-03-05 07:17:10 by jwe]
jwe
parents:
diff changeset
40 #
98e15955107e [project @ 1999-03-05 07:17:10 by jwe]
jwe
parents:
diff changeset
41 # tvals is selected so that || nth(Plist,ii) - nth(Plist,ii-1) || < Ptol
98e15955107e [project @ 1999-03-05 07:17:10 by jwe]
jwe
parents:
diff changeset
42 # for ii=2:length(tvals)
98e15955107e [project @ 1999-03-05 07:17:10 by jwe]
jwe
parents:
diff changeset
43 #
98e15955107e [project @ 1999-03-05 07:17:10 by jwe]
jwe
parents:
diff changeset
44 # Reference:
98e15955107e [project @ 1999-03-05 07:17:10 by jwe]
jwe
parents:
diff changeset
45
98e15955107e [project @ 1999-03-05 07:17:10 by jwe]
jwe
parents:
diff changeset
46 if(nargin < 6 | nargin > 8 | nargout != 2)
98e15955107e [project @ 1999-03-05 07:17:10 by jwe]
jwe
parents:
diff changeset
47 usage("[tvals,Plist] = dre(sys,Q,R,Qf,t0,tf{,Ptol})");
98e15955107e [project @ 1999-03-05 07:17:10 by jwe]
jwe
parents:
diff changeset
48 elseif(!is_struct(sys))
98e15955107e [project @ 1999-03-05 07:17:10 by jwe]
jwe
parents:
diff changeset
49 error("sys must be a system data structure")
98e15955107e [project @ 1999-03-05 07:17:10 by jwe]
jwe
parents:
diff changeset
50 elseif(is_digital(sys))
98e15955107e [project @ 1999-03-05 07:17:10 by jwe]
jwe
parents:
diff changeset
51 error("sys must be a continuous time system")
98e15955107e [project @ 1999-03-05 07:17:10 by jwe]
jwe
parents:
diff changeset
52 elseif(!is_matrix(Q) | !is_matrix(R) | !is_matrix(Qf))
98e15955107e [project @ 1999-03-05 07:17:10 by jwe]
jwe
parents:
diff changeset
53 error("Q, R, and Qf must be matrices.");
98e15955107e [project @ 1999-03-05 07:17:10 by jwe]
jwe
parents:
diff changeset
54 elseif(!is_scalar(t0) | !is_scalar(tf))
98e15955107e [project @ 1999-03-05 07:17:10 by jwe]
jwe
parents:
diff changeset
55 error("t0 and tf must be scalars")
98e15955107e [project @ 1999-03-05 07:17:10 by jwe]
jwe
parents:
diff changeset
56 elseif(t0 >= tf) error("t0=%e >= tf=%e",t0,tf);
98e15955107e [project @ 1999-03-05 07:17:10 by jwe]
jwe
parents:
diff changeset
57 elseif(nargin == 6) Ptol = 0.1;
98e15955107e [project @ 1999-03-05 07:17:10 by jwe]
jwe
parents:
diff changeset
58 elseif(!is_scalar(Ptol)) error("Ptol must be a scalar");
98e15955107e [project @ 1999-03-05 07:17:10 by jwe]
jwe
parents:
diff changeset
59 elseif(Ptol <= 0) error("Ptol must be positive");
98e15955107e [project @ 1999-03-05 07:17:10 by jwe]
jwe
parents:
diff changeset
60 endif
98e15955107e [project @ 1999-03-05 07:17:10 by jwe]
jwe
parents:
diff changeset
61
98e15955107e [project @ 1999-03-05 07:17:10 by jwe]
jwe
parents:
diff changeset
62 if(nargin < 8) maxits = 10;
98e15955107e [project @ 1999-03-05 07:17:10 by jwe]
jwe
parents:
diff changeset
63 elseif(!is_scalar(maxits)) error("maxits must be a scalar");
98e15955107e [project @ 1999-03-05 07:17:10 by jwe]
jwe
parents:
diff changeset
64 elseif(maxits <= 0) error("maxits must be positive");
98e15955107e [project @ 1999-03-05 07:17:10 by jwe]
jwe
parents:
diff changeset
65 endif
98e15955107e [project @ 1999-03-05 07:17:10 by jwe]
jwe
parents:
diff changeset
66 maxits = ceil(maxits);
98e15955107e [project @ 1999-03-05 07:17:10 by jwe]
jwe
parents:
diff changeset
67
98e15955107e [project @ 1999-03-05 07:17:10 by jwe]
jwe
parents:
diff changeset
68 [aa,bb] = sys2ss(sys);
98e15955107e [project @ 1999-03-05 07:17:10 by jwe]
jwe
parents:
diff changeset
69 nn = sysdimensions(sys,"cst");
98e15955107e [project @ 1999-03-05 07:17:10 by jwe]
jwe
parents:
diff changeset
70 mm = sysdimensions(sys,"in");
98e15955107e [project @ 1999-03-05 07:17:10 by jwe]
jwe
parents:
diff changeset
71 pp = sysdimensions(sys,"out");
98e15955107e [project @ 1999-03-05 07:17:10 by jwe]
jwe
parents:
diff changeset
72
3238
041ea33fbbf4 [project @ 1999-03-26 17:48:16 by jwe]
jwe
parents: 3236
diff changeset
73 if(size(Q) != [nn, nn])
3236
98e15955107e [project @ 1999-03-05 07:17:10 by jwe]
jwe
parents:
diff changeset
74 error("Q(%dx%d); sys has %d states",rows(Q),columns(Q),nn);
3238
041ea33fbbf4 [project @ 1999-03-26 17:48:16 by jwe]
jwe
parents: 3236
diff changeset
75 elseif(size(Qf) != [nn, nn])
3236
98e15955107e [project @ 1999-03-05 07:17:10 by jwe]
jwe
parents:
diff changeset
76 error("Qf(%dx%d); sys has %d states",rows(Qf),columns(Qf),nn);
3238
041ea33fbbf4 [project @ 1999-03-26 17:48:16 by jwe]
jwe
parents: 3236
diff changeset
77 elseif(size(R) != [mm, mm])
3236
98e15955107e [project @ 1999-03-05 07:17:10 by jwe]
jwe
parents:
diff changeset
78 error("R(%dx%d); sys has %d inputs",rows(R),columns(R),mm);
98e15955107e [project @ 1999-03-05 07:17:10 by jwe]
jwe
parents:
diff changeset
79 endif
98e15955107e [project @ 1999-03-05 07:17:10 by jwe]
jwe
parents:
diff changeset
80
98e15955107e [project @ 1999-03-05 07:17:10 by jwe]
jwe
parents:
diff changeset
81 # construct Hamiltonian matrix
98e15955107e [project @ 1999-03-05 07:17:10 by jwe]
jwe
parents:
diff changeset
82 H = [aa , -(bb/R)*bb' ; -Q, -aa'];
98e15955107e [project @ 1999-03-05 07:17:10 by jwe]
jwe
parents:
diff changeset
83
98e15955107e [project @ 1999-03-05 07:17:10 by jwe]
jwe
parents:
diff changeset
84 # select time step to avoid numerical overflow
98e15955107e [project @ 1999-03-05 07:17:10 by jwe]
jwe
parents:
diff changeset
85 fast_eig = max(abs(eig(H)));
98e15955107e [project @ 1999-03-05 07:17:10 by jwe]
jwe
parents:
diff changeset
86 tc = log(10)/fast_eig;
98e15955107e [project @ 1999-03-05 07:17:10 by jwe]
jwe
parents:
diff changeset
87 nst = ceil((tf-t0)/tc);
98e15955107e [project @ 1999-03-05 07:17:10 by jwe]
jwe
parents:
diff changeset
88 tvals = -linspace(-tf,-t0,nst);
98e15955107e [project @ 1999-03-05 07:17:10 by jwe]
jwe
parents:
diff changeset
89 Plist = list(Qf);
98e15955107e [project @ 1999-03-05 07:17:10 by jwe]
jwe
parents:
diff changeset
90 In = eye(nn);
98e15955107e [project @ 1999-03-05 07:17:10 by jwe]
jwe
parents:
diff changeset
91 n1 = nn+1;
98e15955107e [project @ 1999-03-05 07:17:10 by jwe]
jwe
parents:
diff changeset
92 n2 = nn+nn;
98e15955107e [project @ 1999-03-05 07:17:10 by jwe]
jwe
parents:
diff changeset
93 done = 0;
98e15955107e [project @ 1999-03-05 07:17:10 by jwe]
jwe
parents:
diff changeset
94 while(!done)
98e15955107e [project @ 1999-03-05 07:17:10 by jwe]
jwe
parents:
diff changeset
95 done = 1; # assume this pass will do the job
98e15955107e [project @ 1999-03-05 07:17:10 by jwe]
jwe
parents:
diff changeset
96 # sort time values in reverse order
98e15955107e [project @ 1999-03-05 07:17:10 by jwe]
jwe
parents:
diff changeset
97 tvals = -sort(-tvals);
98e15955107e [project @ 1999-03-05 07:17:10 by jwe]
jwe
parents:
diff changeset
98 tvlen = length(tvals);
98e15955107e [project @ 1999-03-05 07:17:10 by jwe]
jwe
parents:
diff changeset
99 maxerr = 0;
98e15955107e [project @ 1999-03-05 07:17:10 by jwe]
jwe
parents:
diff changeset
100 # compute new values of P(t); recompute old values just in case
98e15955107e [project @ 1999-03-05 07:17:10 by jwe]
jwe
parents:
diff changeset
101 for ii=2:tvlen
98e15955107e [project @ 1999-03-05 07:17:10 by jwe]
jwe
parents:
diff changeset
102 uv_i_minus_1 = [ In ; nth(Plist,ii-1) ];
98e15955107e [project @ 1999-03-05 07:17:10 by jwe]
jwe
parents:
diff changeset
103 delta_t = tvals(ii-1) - tvals(ii);
98e15955107e [project @ 1999-03-05 07:17:10 by jwe]
jwe
parents:
diff changeset
104 uv = expm(-H*delta_t)*uv_i_minus_1;
98e15955107e [project @ 1999-03-05 07:17:10 by jwe]
jwe
parents:
diff changeset
105 Qi = uv(n1:n2,1:nn)/uv(1:nn,1:nn);
98e15955107e [project @ 1999-03-05 07:17:10 by jwe]
jwe
parents:
diff changeset
106 Plist(ii) = (Qi+Qi')/2;
98e15955107e [project @ 1999-03-05 07:17:10 by jwe]
jwe
parents:
diff changeset
107 # check error
98e15955107e [project @ 1999-03-05 07:17:10 by jwe]
jwe
parents:
diff changeset
108 Perr = norm(nth(Plist,ii) - nth(Plist,ii-1))/norm(nth(Plist,ii));
98e15955107e [project @ 1999-03-05 07:17:10 by jwe]
jwe
parents:
diff changeset
109 maxerr = max(maxerr,Perr);
98e15955107e [project @ 1999-03-05 07:17:10 by jwe]
jwe
parents:
diff changeset
110 if(Perr > Ptol)
98e15955107e [project @ 1999-03-05 07:17:10 by jwe]
jwe
parents:
diff changeset
111 new_t = mean(tvals([ii,ii-1]));
3238
041ea33fbbf4 [project @ 1999-03-26 17:48:16 by jwe]
jwe
parents: 3236
diff changeset
112 tvals = [tvals, new_t];
3236
98e15955107e [project @ 1999-03-05 07:17:10 by jwe]
jwe
parents:
diff changeset
113 done = 0;
98e15955107e [project @ 1999-03-05 07:17:10 by jwe]
jwe
parents:
diff changeset
114 endif
98e15955107e [project @ 1999-03-05 07:17:10 by jwe]
jwe
parents:
diff changeset
115 endfor
98e15955107e [project @ 1999-03-05 07:17:10 by jwe]
jwe
parents:
diff changeset
116
98e15955107e [project @ 1999-03-05 07:17:10 by jwe]
jwe
parents:
diff changeset
117 # check number of iterations
98e15955107e [project @ 1999-03-05 07:17:10 by jwe]
jwe
parents:
diff changeset
118 maxits = maxits - 1;
98e15955107e [project @ 1999-03-05 07:17:10 by jwe]
jwe
parents:
diff changeset
119 done = done+(maxits==0);
98e15955107e [project @ 1999-03-05 07:17:10 by jwe]
jwe
parents:
diff changeset
120 endwhile
98e15955107e [project @ 1999-03-05 07:17:10 by jwe]
jwe
parents:
diff changeset
121 if(maxerr > Ptol)
98e15955107e [project @ 1999-03-05 07:17:10 by jwe]
jwe
parents:
diff changeset
122 warning("dre: \n\texiting with%4d points, max rel chg. =%e, Ptol=%e\n", ...
98e15955107e [project @ 1999-03-05 07:17:10 by jwe]
jwe
parents:
diff changeset
123 tvlen,maxerr,Ptol);
98e15955107e [project @ 1999-03-05 07:17:10 by jwe]
jwe
parents:
diff changeset
124 tvals = tvals(1:length(Plist));
98e15955107e [project @ 1999-03-05 07:17:10 by jwe]
jwe
parents:
diff changeset
125 endif
98e15955107e [project @ 1999-03-05 07:17:10 by jwe]
jwe
parents:
diff changeset
126 endfunction