annotate scripts/control/hinf/is_dgkf.m @ 7131:a184bc985c37

[project @ 2007-11-08 15:55:02 by jwe]
author jwe
date Thu, 08 Nov 2007 15:55:02 +0000
parents a1dbe9d80eee
children df9519e9990c
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
7131
a184bc985c37 [project @ 2007-11-08 15:55:02 by jwe]
jwe
parents: 7017
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 ();
7131
a184bc985c37 [project @ 2007-11-08 15:55:02 by jwe]
jwe
parents: 7017
diff changeset
136 elseif (! isscalar (nu) || ! isscalar (ny))
a184bc985c37 [project @ 2007-11-08 15:55:02 by jwe]
jwe
parents: 7017
diff changeset
137 error ("is_dgkf: arguments 2 and 3 must be scalars")
a184bc985c37 [project @ 2007-11-08 15:55:02 by jwe]
jwe
parents: 7017
diff changeset
138 elseif (! isstruct (Asys))
a184bc985c37 [project @ 2007-11-08 15:55:02 by jwe]
jwe
parents: 7017
diff changeset
139 error ("Argument 1 must be a system data structure");
3440
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
140 endif
7131
a184bc985c37 [project @ 2007-11-08 15:55:02 by jwe]
jwe
parents: 7017
diff changeset
141 if (nargin < 4)
3440
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
142 tol = 200*eps;
7131
a184bc985c37 [project @ 2007-11-08 15:55:02 by jwe]
jwe
parents: 7017
diff changeset
143 elseif (! is_sample (tol))
a184bc985c37 [project @ 2007-11-08 15:55:02 by jwe]
jwe
parents: 7017
diff changeset
144 error ("is_dgkf: tol must be a positive scalar")
3440
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
7131
a184bc985c37 [project @ 2007-11-08 15:55:02 by jwe]
jwe
parents: 7017
diff changeset
149 dflg = is_digital (Asys);
a184bc985c37 [project @ 2007-11-08 15:55:02 by jwe]
jwe
parents: 7017
diff changeset
150 [Anc, Anz, nin, nout ] = sysdimensions (Asys);
3440
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
151
7131
a184bc985c37 [project @ 2007-11-08 15:55:02 by jwe]
jwe
parents: 7017
diff changeset
152 if (Anz == 0 && Anc == 0)
a184bc985c37 [project @ 2007-11-08 15:55:02 by jwe]
jwe
parents: 7017
diff changeset
153 error ("is_dgkf: no system states");
a184bc985c37 [project @ 2007-11-08 15:55:02 by jwe]
jwe
parents: 7017
diff changeset
154 elseif (nu >= nin)
a184bc985c37 [project @ 2007-11-08 15:55:02 by jwe]
jwe
parents: 7017
diff changeset
155 error ("is_dgkf: insufficient number of disturbance inputs");
a184bc985c37 [project @ 2007-11-08 15:55:02 by jwe]
jwe
parents: 7017
diff changeset
156 elseif (ny >= nout)
a184bc985c37 [project @ 2007-11-08 15:55:02 by jwe]
jwe
parents: 7017
diff changeset
157 error ("is_dgkf: insufficient number of regulated outputs");
3440
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
7131
a184bc985c37 [project @ 2007-11-08 15:55:02 by jwe]
jwe
parents: 7017
diff changeset
160 nw = nin - nu;
a184bc985c37 [project @ 2007-11-08 15:55:02 by jwe]
jwe
parents: 7017
diff changeset
161 nz = nout - ny;
3440
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
162
7131
a184bc985c37 [project @ 2007-11-08 15:55:02 by jwe]
jwe
parents: 7017
diff changeset
163 nw1 = nw + 1;
a184bc985c37 [project @ 2007-11-08 15:55:02 by jwe]
jwe
parents: 7017
diff changeset
164 nz1 = nz + 1;
a184bc985c37 [project @ 2007-11-08 15:55:02 by jwe]
jwe
parents: 7017
diff changeset
165
a184bc985c37 [project @ 2007-11-08 15:55:02 by jwe]
jwe
parents: 7017
diff changeset
166 [A, B, C, D] = sys2ss (Asys);
3440
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
167 ## scale input/output for numerical reasons
7131
a184bc985c37 [project @ 2007-11-08 15:55:02 by jwe]
jwe
parents: 7017
diff changeset
168 if (norm (C, "fro") * norm (B, "fro") == 0)
a184bc985c37 [project @ 2007-11-08 15:55:02 by jwe]
jwe
parents: 7017
diff changeset
169 error ("||C||*||B|| = 0; no dynamic connnection from inputs to outputs");
3440
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
170 endif
7131
a184bc985c37 [project @ 2007-11-08 15:55:02 by jwe]
jwe
parents: 7017
diff changeset
171 xx = sqrt (norm (B, Inf) / norm (C, Inf));
3440
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
172 B = B / xx; C = C * xx;
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
173
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
174 ## partition matrices
7131
a184bc985c37 [project @ 2007-11-08 15:55:02 by jwe]
jwe
parents: 7017
diff changeset
175 Bw = B(:,1:nw);
a184bc985c37 [project @ 2007-11-08 15:55:02 by jwe]
jwe
parents: 7017
diff changeset
176 Bu = B(:,nw1:nin);
a184bc985c37 [project @ 2007-11-08 15:55:02 by jwe]
jwe
parents: 7017
diff changeset
177
a184bc985c37 [project @ 2007-11-08 15:55:02 by jwe]
jwe
parents: 7017
diff changeset
178 Cz = C(1:nz,:);
a184bc985c37 [project @ 2007-11-08 15:55:02 by jwe]
jwe
parents: 7017
diff changeset
179 Cy = C(nz1:nout,:);
a184bc985c37 [project @ 2007-11-08 15:55:02 by jwe]
jwe
parents: 7017
diff changeset
180
a184bc985c37 [project @ 2007-11-08 15:55:02 by jwe]
jwe
parents: 7017
diff changeset
181 Dzw = D(1:nz,1:nw);
a184bc985c37 [project @ 2007-11-08 15:55:02 by jwe]
jwe
parents: 7017
diff changeset
182 Dzu = D(1:nz,nw1:nin);
a184bc985c37 [project @ 2007-11-08 15:55:02 by jwe]
jwe
parents: 7017
diff changeset
183
a184bc985c37 [project @ 2007-11-08 15:55:02 by jwe]
jwe
parents: 7017
diff changeset
184 Dyw = D(nz1:nout,1:nw);
a184bc985c37 [project @ 2007-11-08 15:55:02 by jwe]
jwe
parents: 7017
diff changeset
185 Dyu = D(nz1:nout,nw1:nin);
3440
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
186
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
187 ## Check for loopo shifting
7131
a184bc985c37 [project @ 2007-11-08 15:55:02 by jwe]
jwe
parents: 7017
diff changeset
188 Dyu_nz = (norm (Dyu, Inf) != 0);
3440
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
189 if (Dyu_nz)
7131
a184bc985c37 [project @ 2007-11-08 15:55:02 by jwe]
jwe
parents: 7017
diff changeset
190 warning ("is_dgkf: D22 nonzero; performing loop shifting");
3440
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 ## 12 - rank condition at w = 0
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
194 xx =[A, Bu; Cz, Dzu];
7131
a184bc985c37 [project @ 2007-11-08 15:55:02 by jwe]
jwe
parents: 7017
diff changeset
195 [nr, nc] = size (xx);
a184bc985c37 [project @ 2007-11-08 15:55:02 by jwe]
jwe
parents: 7017
diff changeset
196 irank = rank (xx);
3440
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
197 if (irank != nc)
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
198 retval = 0;
7131
a184bc985c37 [project @ 2007-11-08 15:55:02 by jwe]
jwe
parents: 7017
diff changeset
199 warning ("rank([A Bu; Cz Dzu]) = %d, need %d; n=%d, nz=%d, nu=%d",
a184bc985c37 [project @ 2007-11-08 15:55:02 by jwe]
jwe
parents: 7017
diff changeset
200 irank, nc, Anc+Anz, nz, nu);
a184bc985c37 [project @ 2007-11-08 15:55:02 by jwe]
jwe
parents: 7017
diff changeset
201 warning (" *** 12-rank condition violated at w = 0");
3440
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 ## 21 - rank condition at w = 0
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
205 xx =[A, Bw; Cy, Dyw];
7131
a184bc985c37 [project @ 2007-11-08 15:55:02 by jwe]
jwe
parents: 7017
diff changeset
206 [nr, nc] = size (xx);
a184bc985c37 [project @ 2007-11-08 15:55:02 by jwe]
jwe
parents: 7017
diff changeset
207 irank = rank (xx);
3440
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
208 if (irank != nr)
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
209 retval = 0;
7131
a184bc985c37 [project @ 2007-11-08 15:55:02 by jwe]
jwe
parents: 7017
diff changeset
210 warning ("rank([A Bw; Cy Dyw]) = %d, need %d; n=%d, ny=%d, nw=%d",
a184bc985c37 [project @ 2007-11-08 15:55:02 by jwe]
jwe
parents: 7017
diff changeset
211 irank, nr, Anc+Anz, ny, nw);
a184bc985c37 [project @ 2007-11-08 15:55:02 by jwe]
jwe
parents: 7017
diff changeset
212 warning (" *** 21-rank condition violated at w = 0");
3440
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
213 endif
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
214
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
215 ## can Dzu be transformed to become [0 I]' or [I]?
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
216 ## This ensures a normalized weight
7131
a184bc985c37 [project @ 2007-11-08 15:55:02 by jwe]
jwe
parents: 7017
diff changeset
217 [Qz, Ru] = qr (Dzu);
a184bc985c37 [project @ 2007-11-08 15:55:02 by jwe]
jwe
parents: 7017
diff changeset
218 irank = rank (Ru);
3440
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
219 if (irank != nu)
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
220 retval = 0;
7131
a184bc985c37 [project @ 2007-11-08 15:55:02 by jwe]
jwe
parents: 7017
diff changeset
221 warning ("*** rank(Dzu(%d x %d) = %d", nz, nu, irank);
a184bc985c37 [project @ 2007-11-08 15:55:02 by jwe]
jwe
parents: 7017
diff changeset
222 warning ("*** Dzu does not have full column rank");
3440
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
223 endif
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
224 if (nu >= nz)
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
225 Qz = Qz(:,1:nu)';
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
226 else
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
227 Qz = [Qz(:,(nu+1):nz), Qz(:,1:nu)]';
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 Ru = Ru(1:nu,:);
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
230
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
231 ## can Dyw be transformed to become [0 I] or [I]?
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
232 ## This ensures a normalized weight
7131
a184bc985c37 [project @ 2007-11-08 15:55:02 by jwe]
jwe
parents: 7017
diff changeset
233 [Qw, Ry] = qr (Dyw');
a184bc985c37 [project @ 2007-11-08 15:55:02 by jwe]
jwe
parents: 7017
diff changeset
234 irank = rank (Ry);
3440
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
235 if (irank != ny)
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
236 retval = 0;
7131
a184bc985c37 [project @ 2007-11-08 15:55:02 by jwe]
jwe
parents: 7017
diff changeset
237 warning ("*** rank(Dyw(%d x %d) = %d", ny, nw, irank);
a184bc985c37 [project @ 2007-11-08 15:55:02 by jwe]
jwe
parents: 7017
diff changeset
238 warning (" *** Dyw does not have full row rank");
3440
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
239 endif
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
240
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
241 if (ny >= nw)
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
242 Qw = Qw(:,1:ny);
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
243 else
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
244 Qw = [Qw(:,(ny+1):nw), Qw(:,1:ny)];
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
245 endif
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
246 Ry = Ry(1:ny,:)';
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 ## transform P by Qz/Ru and Qw/Ry
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
249 Bw = Bw*Qw;
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
250 Bu = Bu/Ru;
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
251 B = [Bw, Bu];
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
252 Cz = Qz*Cz;
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
253 Cy = Ry\Cy;
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
254 C = [Cz; Cy];
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
255 Dzw = Qz*Dzw*Qw;
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
256 Dzu = Qz*Dzu/Ru;
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
257 Dyw = Ry\Dyw*Qw;
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
258
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
259 ## pack the return structure
7131
a184bc985c37 [project @ 2007-11-08 15:55:02 by jwe]
jwe
parents: 7017
diff changeset
260 dgkf_struct.nw = nw;
a184bc985c37 [project @ 2007-11-08 15:55:02 by jwe]
jwe
parents: 7017
diff changeset
261 dgkf_struct.nu = nu;
a184bc985c37 [project @ 2007-11-08 15:55:02 by jwe]
jwe
parents: 7017
diff changeset
262 dgkf_struct.nz = nz;
a184bc985c37 [project @ 2007-11-08 15:55:02 by jwe]
jwe
parents: 7017
diff changeset
263 dgkf_struct.ny = ny;
a184bc985c37 [project @ 2007-11-08 15:55:02 by jwe]
jwe
parents: 7017
diff changeset
264 dgkf_struct.A = A;
a184bc985c37 [project @ 2007-11-08 15:55:02 by jwe]
jwe
parents: 7017
diff changeset
265 dgkf_struct.Bw = Bw;
a184bc985c37 [project @ 2007-11-08 15:55:02 by jwe]
jwe
parents: 7017
diff changeset
266 dgkf_struct.Bu = Bu;
a184bc985c37 [project @ 2007-11-08 15:55:02 by jwe]
jwe
parents: 7017
diff changeset
267 dgkf_struct.Cz = Cz;
a184bc985c37 [project @ 2007-11-08 15:55:02 by jwe]
jwe
parents: 7017
diff changeset
268 dgkf_struct.Cy = Cy;
a184bc985c37 [project @ 2007-11-08 15:55:02 by jwe]
jwe
parents: 7017
diff changeset
269 dgkf_struct.Dzw = Dzw;
a184bc985c37 [project @ 2007-11-08 15:55:02 by jwe]
jwe
parents: 7017
diff changeset
270 dgkf_struct.Dzu = Dzu;
a184bc985c37 [project @ 2007-11-08 15:55:02 by jwe]
jwe
parents: 7017
diff changeset
271 dgkf_struct.Dyw = Dyw;
a184bc985c37 [project @ 2007-11-08 15:55:02 by jwe]
jwe
parents: 7017
diff changeset
272 dgkf_struct.Dyu = Dyu;
a184bc985c37 [project @ 2007-11-08 15:55:02 by jwe]
jwe
parents: 7017
diff changeset
273 dgkf_struct.Ru = Ru;
a184bc985c37 [project @ 2007-11-08 15:55:02 by jwe]
jwe
parents: 7017
diff changeset
274 dgkf_struct.Ry = Ry;
a184bc985c37 [project @ 2007-11-08 15:55:02 by jwe]
jwe
parents: 7017
diff changeset
275 dgkf_struct.Dyu_nz = Dyu_nz;
a184bc985c37 [project @ 2007-11-08 15:55:02 by jwe]
jwe
parents: 7017
diff changeset
276 dgkf_struct.dflg = dflg;
3440
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
277
c487fb85b843 [project @ 2000-01-14 22:00:19 by jwe]
jwe
parents:
diff changeset
278 endfunction