annotate scripts/control/hinf/is_dgkf.m @ 7017:a1dbe9d80eee

[project @ 2007-10-12 21:27:11 by jwe]
author jwe
date Fri, 12 Oct 2007 21:27:37 +0000
parents 93c65f2a5668
children a184bc985c37
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
7017
a1dbe9d80eee [project @ 2007-10-12 21:27:11 by jwe]
jwe
parents: 7016
diff changeset
1 ## Copyright (C) 1996, 1998, 2000, 2002, 2004, 2005, 2006, 2007
a1dbe9d80eee [project @ 2007-10-12 21:27:11 by jwe]
jwe
parents: 7016
diff changeset
2 ## Auburn University. All rights reserved.
3440
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
3 ##
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
4 ## This file is part of Octave.
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
5 ##
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
6 ## Octave is free software; you can redistribute it and/or modify it
7016
93c65f2a5668 [project @ 2007-10-12 06:40:56 by jwe]
jwe
parents: 6046
diff changeset
7 ## under the terms of the GNU General Public License as published by
93c65f2a5668 [project @ 2007-10-12 06:40:56 by jwe]
jwe
parents: 6046
diff changeset
8 ## the Free Software Foundation; either version 3 of the License, or (at
93c65f2a5668 [project @ 2007-10-12 06:40:56 by jwe]
jwe
parents: 6046
diff changeset
9 ## your option) any later version.
3440
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
10 ##
7016
93c65f2a5668 [project @ 2007-10-12 06:40:56 by jwe]
jwe
parents: 6046
diff changeset
11 ## Octave is distributed in the hope that it will be useful, but
93c65f2a5668 [project @ 2007-10-12 06:40:56 by jwe]
jwe
parents: 6046
diff changeset
12 ## WITHOUT ANY WARRANTY; without even the implied warranty of
93c65f2a5668 [project @ 2007-10-12 06:40:56 by jwe]
jwe
parents: 6046
diff changeset
13 ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
93c65f2a5668 [project @ 2007-10-12 06:40:56 by jwe]
jwe
parents: 6046
diff changeset
14 ## General Public License for more details.
3440
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
15 ##
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
16 ## You should have received a copy of the GNU General Public License
7016
93c65f2a5668 [project @ 2007-10-12 06:40:56 by jwe]
jwe
parents: 6046
diff changeset
17 ## along with Octave; see the file COPYING. If not, see
93c65f2a5668 [project @ 2007-10-12 06:40:56 by jwe]
jwe
parents: 6046
diff changeset
18 ## <http://www.gnu.org/licenses/>.
3440
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
19
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
20 ## -*- texinfo -*-
3502
b5238ac1dca9 [project @ 2000-01-31 07:40:53 by jwe]
jwe
parents: 3500
diff changeset
21 ## @deftypefn {Function File} {[@var{retval}, @var{dgkf_struct} ] =} is_dgkf (@var{asys}, @var{nu}, @var{ny}, @var{tol} )
3440
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
22 ## Determine whether a continuous time state space system meets
5016
bdbee5282954 [project @ 2004-09-22 02:50:35 by jwe]
jwe
parents: 4946
diff changeset
23 ## assumptions of @acronym{DGKF} algorithm.
3440
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
24 ## Partitions system into:
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
25 ## @example
5016
bdbee5282954 [project @ 2004-09-22 02:50:35 by jwe]
jwe
parents: 4946
diff changeset
26 ## [dx/dt] [A | Bw Bu ][w]
bdbee5282954 [project @ 2004-09-22 02:50:35 by jwe]
jwe
parents: 4946
diff changeset
27 ## [ z ] = [Cz | Dzw Dzu ][u]
3440
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
28 ## [ y ] [Cy | Dyw Dyu ]
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
29 ## @end example
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
30 ## or similar discrete-time system.
3502
b5238ac1dca9 [project @ 2000-01-31 07:40:53 by jwe]
jwe
parents: 3500
diff changeset
31 ## If necessary, orthogonal transformations @var{qw}, @var{qz} and nonsingular
b5238ac1dca9 [project @ 2000-01-31 07:40:53 by jwe]
jwe
parents: 3500
diff changeset
32 ## transformations @var{ru}, @var{ry} are applied to respective vectors
5016
bdbee5282954 [project @ 2004-09-22 02:50:35 by jwe]
jwe
parents: 4946
diff changeset
33 ## @var{w}, @var{z}, @var{u}, @var{y} in order to satisfy @acronym{DGKF} assumptions.
3502
b5238ac1dca9 [project @ 2000-01-31 07:40:53 by jwe]
jwe
parents: 3500
diff changeset
34 ## Loop shifting is used if @var{dyu} block is nonzero.
3440
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
35 ##
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
36 ## @strong{Inputs}
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
37 ## @table @var
3502
b5238ac1dca9 [project @ 2000-01-31 07:40:53 by jwe]
jwe
parents: 3500
diff changeset
38 ## @item asys
3440
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
39 ## system data structure
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
40 ## @item nu
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
41 ## number of controlled inputs
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
42 ## @item ny
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
43 ## number of measured outputs
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
44 ## @item tol
5016
bdbee5282954 [project @ 2004-09-22 02:50:35 by jwe]
jwe
parents: 4946
diff changeset
45 ## threshold for 0; default: 200*@code{eps}.
3440
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
46 ## @end table
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
47 ## @strong{Outputs}
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
48 ## @table @var
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
49 ## @item retval
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
50 ## true(1) if system passes check, false(0) otherwise
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
51 ## @item dgkf_struct
5016
bdbee5282954 [project @ 2004-09-22 02:50:35 by jwe]
jwe
parents: 4946
diff changeset
52 ## data structure of @command{is_dgkf} results. Entries:
3440
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
53 ## @table @var
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
54 ## @item nw
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
55 ## @itemx nz
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
56 ## dimensions of @var{w}, @var{z}
3502
b5238ac1dca9 [project @ 2000-01-31 07:40:53 by jwe]
jwe
parents: 3500
diff changeset
57 ## @item a
b5238ac1dca9 [project @ 2000-01-31 07:40:53 by jwe]
jwe
parents: 3500
diff changeset
58 ## system @math{A} matrix
b5238ac1dca9 [project @ 2000-01-31 07:40:53 by jwe]
jwe
parents: 3500
diff changeset
59 ## @item bw
b5238ac1dca9 [project @ 2000-01-31 07:40:53 by jwe]
jwe
parents: 3500
diff changeset
60 ## (@var{n} x @var{nw}) @var{qw}-transformed disturbance input matrix
b5238ac1dca9 [project @ 2000-01-31 07:40:53 by jwe]
jwe
parents: 3500
diff changeset
61 ## @item bu
b5238ac1dca9 [project @ 2000-01-31 07:40:53 by jwe]
jwe
parents: 3500
diff changeset
62 ## (@var{n} x @var{nu}) @var{ru}-transformed controlled input matrix;
3440
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
63 ##
4946
48a39e2b2ab7 [project @ 2004-08-31 17:27:04 by jwe]
jwe
parents: 4030
diff changeset
64 ## @math{B = [Bw Bu]}
3502
b5238ac1dca9 [project @ 2000-01-31 07:40:53 by jwe]
jwe
parents: 3500
diff changeset
65 ## @item cz
3440
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
66 ## (@var{nz} x @var{n}) Qz-transformed error output matrix
3502
b5238ac1dca9 [project @ 2000-01-31 07:40:53 by jwe]
jwe
parents: 3500
diff changeset
67 ## @item cy
b5238ac1dca9 [project @ 2000-01-31 07:40:53 by jwe]
jwe
parents: 3500
diff changeset
68 ## (@var{ny} x @var{n}) @var{ry}-transformed measured output matrix
3440
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
69 ##
4946
48a39e2b2ab7 [project @ 2004-08-31 17:27:04 by jwe]
jwe
parents: 4030
diff changeset
70 ## @math{C = [Cz; Cy]}
3502
b5238ac1dca9 [project @ 2000-01-31 07:40:53 by jwe]
jwe
parents: 3500
diff changeset
71 ## @item dzu
b5238ac1dca9 [project @ 2000-01-31 07:40:53 by jwe]
jwe
parents: 3500
diff changeset
72 ## @item dyw
b5238ac1dca9 [project @ 2000-01-31 07:40:53 by jwe]
jwe
parents: 3500
diff changeset
73 ## off-diagonal blocks of transformed system @math{D} matrix that enter
3440
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
74 ## @var{z}, @var{y} from @var{u}, @var{w} respectively
3502
b5238ac1dca9 [project @ 2000-01-31 07:40:53 by jwe]
jwe
parents: 3500
diff changeset
75 ## @item ru
3440
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
76 ## controlled input transformation matrix
3502
b5238ac1dca9 [project @ 2000-01-31 07:40:53 by jwe]
jwe
parents: 3500
diff changeset
77 ## @item ry
3440
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
78 ## observed output transformation matrix
3502
b5238ac1dca9 [project @ 2000-01-31 07:40:53 by jwe]
jwe
parents: 3500
diff changeset
79 ## @item dyu_nz
b5238ac1dca9 [project @ 2000-01-31 07:40:53 by jwe]
jwe
parents: 3500
diff changeset
80 ## nonzero if the @var{dyu} block is nonzero.
b5238ac1dca9 [project @ 2000-01-31 07:40:53 by jwe]
jwe
parents: 3500
diff changeset
81 ## @item dyu
b5238ac1dca9 [project @ 2000-01-31 07:40:53 by jwe]
jwe
parents: 3500
diff changeset
82 ## untransformed @var{dyu} block
3440
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
83 ## @item dflg
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
84 ## nonzero if the system is discrete-time
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
85 ## @end table
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
86 ## @end table
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
87 ## @code{is_dgkf} exits with an error if the system is mixed
5016
bdbee5282954 [project @ 2004-09-22 02:50:35 by jwe]
jwe
parents: 4946
diff changeset
88 ## discrete/continuous.
3440
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
89 ##
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
90 ## @strong{References}
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
91 ## @table @strong
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
92 ## @item [1]
5016
bdbee5282954 [project @ 2004-09-22 02:50:35 by jwe]
jwe
parents: 4946
diff changeset
93 ## Doyle, Glover, Khargonekar, Francis, @cite{State Space Solutions to Standard}
bdbee5282954 [project @ 2004-09-22 02:50:35 by jwe]
jwe
parents: 4946
diff changeset
94 ## @iftex
bdbee5282954 [project @ 2004-09-22 02:50:35 by jwe]
jwe
parents: 4946
diff changeset
95 ## @tex
bdbee5282954 [project @ 2004-09-22 02:50:35 by jwe]
jwe
parents: 4946
diff changeset
96 ## $ { \cal H }_2 $ @cite{and} $ { \cal H }_\infty $
bdbee5282954 [project @ 2004-09-22 02:50:35 by jwe]
jwe
parents: 4946
diff changeset
97 ## @end tex
bdbee5282954 [project @ 2004-09-22 02:50:35 by jwe]
jwe
parents: 4946
diff changeset
98 ## @end iftex
bdbee5282954 [project @ 2004-09-22 02:50:35 by jwe]
jwe
parents: 4946
diff changeset
99 ## @ifinfo
bdbee5282954 [project @ 2004-09-22 02:50:35 by jwe]
jwe
parents: 4946
diff changeset
100 ## @cite{H-2 and H-infinity}
bdbee5282954 [project @ 2004-09-22 02:50:35 by jwe]
jwe
parents: 4946
diff changeset
101 ## @end ifinfo
bdbee5282954 [project @ 2004-09-22 02:50:35 by jwe]
jwe
parents: 4946
diff changeset
102 ## @cite{Control Problems}, @acronym{IEEE} @acronym{TAC} August 1989.
3440
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
103 ## @item [2]
5016
bdbee5282954 [project @ 2004-09-22 02:50:35 by jwe]
jwe
parents: 4946
diff changeset
104 ## Maciejowksi, J.M., @cite{Multivariable Feedback Design}, Addison-Wesley, 1989.
3440
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
105 ## @end table
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
106 ## @end deftypefn
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
107
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
108 ## Author: A. S. Hodel <a.s.hodel@eng.auburn.edu>
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
109 ## Updated by John Ingram July 1996 to accept structured systems
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
110
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
111 ## Revised by Kai P. Mueller April 1998 to solve the general H_infinity
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
112 ## problem using unitary transformations Q (on w and z)
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
113 ## and non-singular transformations R (on u and y) such
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
114 ## that the Dzu and Dyw matrices of the transformed plant
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
115 ##
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
116 ## ~
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
117 ## P (the variable Asys here)
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
118 ##
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
119 ## become
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
120 ##
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
121 ## ~ -1 T
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
122 ## D = Q D R = [ 0 I ] or [ I ],
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
123 ## 12 12 12 12
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
124 ##
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
125 ## ~ T
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
126 ## D = R D Q = [ 0 I ] or [ I ].
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
127 ## 21 21 21 21
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
128 ##
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
129 ## This transformation together with the algorithm in [1] solves
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
130 ## the general problem (see [2] for example).
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
131
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
132 function [retval, dgkf_struct] = is_dgkf (Asys, nu, ny, tol)
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
133
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
134 if (nargin < 3) | (nargin > 4)
6046
34f96dd5441b [project @ 2006-10-10 16:10:25 by jwe]
jwe
parents: 5307
diff changeset
135 print_usage ();
4030
22bd65326ec1 [project @ 2002-08-09 18:58:13 by jwe]
jwe
parents: 3502
diff changeset
136 elseif (! isscalar(nu) | ! isscalar(ny) )
3440
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
137 error("is_dgkf: arguments 2 and 3 must be scalars")
4030
22bd65326ec1 [project @ 2002-08-09 18:58:13 by jwe]
jwe
parents: 3502
diff changeset
138 elseif (! isstruct(Asys) )
3440
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
139 error("Argument 1 must be a system data structure");
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
140 endif
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
141 if(nargin < 4)
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
142 tol = 200*eps;
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
143 elseif( !is_sample(tol) )
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
144 error("is_dgkf: tol must be a positive scalar")
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
145 endif
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
146
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
147 retval = 1; # assume passes test
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
148
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
149 dflg = is_digital(Asys);
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
150 [Anc, Anz, nin, nout ] = sysdimensions(Asys);
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
151
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
152 if( Anz == 0 & Anc == 0 )
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
153 error("is_dgkf: no system states");
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
154 elseif( nu >= nin )
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
155 error("is_dgkf: insufficient number of disturbance inputs");
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
156 elseif( ny >= nout )
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
157 error("is_dgkf: insufficient number of regulated outputs");
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
158 endif
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
159
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
160 nw = nin - nu; nw1 = nw + 1;
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
161 nz = nout - ny; nz1 = nz + 1;
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
162
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
163 [A,B,C,D] = sys2ss(Asys);
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
164 ## scale input/output for numerical reasons
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
165 if(norm (C, "fro") * norm (B, "fro") == 0)
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
166 error("||C||*||B|| = 0; no dynamic connnection from inputs to outputs");
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
167 endif
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
168 xx = sqrt(norm(B, Inf) / norm(C, Inf));
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
169 B = B / xx; C = C * xx;
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
170
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
171 ## partition matrices
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
172 Bw = B(:,1:nw); Bu = B(:,nw1:nin);
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
173 Cz = C(1:nz,:); Dzw = D(1:nz,1:nw); Dzu = D(1:nz,nw1:nin);
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
174 Cy = C(nz1:nout,:); Dyw = D(nz1:nout,1:nw); Dyu = D(nz1:nout,nw1:nin);
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
175
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
176 ## Check for loopo shifting
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
177 Dyu_nz = (norm(Dyu,Inf) != 0);
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
178 if (Dyu_nz)
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
179 warning("is_dgkf: D22 nonzero; performing loop shifting");
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
180 endif
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
181
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
182 ## 12 - rank condition at w = 0
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
183 xx =[A, Bu; Cz, Dzu];
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
184 [nr, nc] = size(xx);
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
185 irank = rank(xx);
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
186 if (irank != nc)
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
187 retval = 0;
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
188 warning(sprintf("rank([A Bu; Cz Dzu]) = %d, need %d; n=%d, nz=%d, nu=%d", ...
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
189 irank,nc,(Anc+Anz),nz,nu));
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
190 warning(" *** 12-rank condition violated at w = 0.");
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
191 endif
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
192
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
193 ## 21 - rank condition at w = 0
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
194 xx =[A, Bw; Cy, Dyw];
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
195 [nr, nc] = size(xx);
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
196 irank = rank(xx);
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
197 if (irank != nr)
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
198 retval = 0;
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
199 warning(sprintf("rank([A Bw; Cy Dyw]) = %d, need %d; n=%d, ny=%d, nw=%d", ...
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
200 irank,nr,(Anc+Anz),ny,nw));
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
201 warning(" *** 21-rank condition violated at w = 0.");
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
202 endif
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
203
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
204 ## can Dzu be transformed to become [0 I]' or [I]?
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
205 ## This ensures a normalized weight
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
206 [Qz, Ru] = qr(Dzu);
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
207 irank = rank(Ru);
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
208 if (irank != nu)
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
209 retval = 0;
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
210 warning(sprintf("*** rank(Dzu(%d x %d) = %d", nz, nu, irank));
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
211 warning(" *** Dzu does not have full column rank.");
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
212 endif
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
213 if (nu >= nz)
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
214 Qz = Qz(:,1:nu)';
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
215 else
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
216 Qz = [Qz(:,(nu+1):nz), Qz(:,1:nu)]';
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
217 endif
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
218 Ru = Ru(1:nu,:);
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
219
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
220 ## can Dyw be transformed to become [0 I] or [I]?
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
221 ## This ensures a normalized weight
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
222 [Qw, Ry] = qr(Dyw');
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
223 irank = rank(Ry);
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
224 if (irank != ny)
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
225 retval = 0;
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
226 warning(sprintf("*** rank(Dyw(%d x %d) = %d", ny, nw, irank));
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
227 warning(" *** Dyw does not have full row rank.");
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
228 endif
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
229
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
230 if (ny >= nw)
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
231 Qw = Qw(:,1:ny);
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
232 else
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
233 Qw = [Qw(:,(ny+1):nw), Qw(:,1:ny)];
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
234 endif
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
235 Ry = Ry(1:ny,:)';
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
236
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
237 ## transform P by Qz/Ru and Qw/Ry
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
238 Bw = Bw*Qw;
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
239 Bu = Bu/Ru;
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
240 B = [Bw, Bu];
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
241 Cz = Qz*Cz;
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
242 Cy = Ry\Cy;
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
243 C = [Cz; Cy];
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
244 Dzw = Qz*Dzw*Qw;
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
245 Dzu = Qz*Dzu/Ru;
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
246 Dyw = Ry\Dyw*Qw;
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
247
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
248 ## pack the return structure
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
249 dgkf_struct.nw = nw;
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
250 dgkf_struct.nu = nu;
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
251 dgkf_struct.nz = nz;
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
252 dgkf_struct.ny = ny;
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
253 dgkf_struct.A = A;
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
254 dgkf_struct.Bw = Bw;
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
255 dgkf_struct.Bu = Bu;
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
256 dgkf_struct.Cz = Cz;
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
257 dgkf_struct.Cy = Cy;
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
258 dgkf_struct.Dzw = Dzw;
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
259 dgkf_struct.Dzu = Dzu;
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
260 dgkf_struct.Dyw = Dyw;
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
261 dgkf_struct.Dyu = Dyu;
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
262 dgkf_struct.Ru = Ru;
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
263 dgkf_struct.Ry = Ry;
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
264 dgkf_struct.Dyu_nz = Dyu_nz;
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
265 dgkf_struct.dflg = dflg;
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
266
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
267 endfunction