annotate scripts/control/hinf/is_dgkf.m @ 5016:bdbee5282954

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