annotate scripts/control/system/sysconnect.m @ 7583:1d7c23e288d7

__go_draw_axes__: use strcmpi for text properties; use get for hidden properties
author John W. Eaton <jwe@octave.org>
date Tue, 11 Mar 2008 23:12:17 -0400
parents 38fe664f0ef1
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.
3430
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
3 ##
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
4 ## This file is part of Octave.
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
5 ##
65b3519ac3a1 [project @ 2000-01-14 03:44:03 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.
3430
65b3519ac3a1 [project @ 2000-01-14 03:44:03 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.
3430
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
15 ##
65b3519ac3a1 [project @ 2000-01-14 03:44:03 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/>.
3430
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
19
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
20 ## -*- texinfo -*-
5016
bdbee5282954 [project @ 2004-09-22 02:50:35 by jwe]
jwe
parents: 4771
diff changeset
21 ## @deftypefn {Function File} {@var{clsys} =} sysconnect (@var{sys}, @var{out_idx}, @var{in_idx}, @var{order}, @var{tol})
3430
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
22 ## Close the loop from specified outputs to respective specified inputs
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
23 ##
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
24 ## @strong{Inputs}
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
25 ## @table @var
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
26 ## @item sys
5016
bdbee5282954 [project @ 2004-09-22 02:50:35 by jwe]
jwe
parents: 4771
diff changeset
27 ## System data structure.
3430
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
28 ## @item out_idx
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
29 ## @itemx in_idx
5016
bdbee5282954 [project @ 2004-09-22 02:50:35 by jwe]
jwe
parents: 4771
diff changeset
30 ## Names or indices of signals to connect (see @code{sysidx}).
3462
04aef7306dca [project @ 2000-01-19 17:16:43 by hodelas]
hodelas
parents: 3430
diff changeset
31 ## The output specified by @math{out_idx(ii)} is connected to the input
04aef7306dca [project @ 2000-01-19 17:16:43 by hodelas]
hodelas
parents: 3430
diff changeset
32 ## specified by @math{in_idx(ii)}.
3430
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
33 ## @item order
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
34 ## logical flag (default = 0)
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
35 ## @table @code
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
36 ## @item 0
5016
bdbee5282954 [project @ 2004-09-22 02:50:35 by jwe]
jwe
parents: 4771
diff changeset
37 ## Leave inputs and outputs in their original order.
3430
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
38 ## @item 1
5016
bdbee5282954 [project @ 2004-09-22 02:50:35 by jwe]
jwe
parents: 4771
diff changeset
39 ## Permute inputs and outputs to the order shown in the diagram below.
3430
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
40 ## @end table
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
41 ## @item tol
5016
bdbee5282954 [project @ 2004-09-22 02:50:35 by jwe]
jwe
parents: 4771
diff changeset
42 ## Tolerance for singularities in algebraic loops, default: 200@code{eps}.
3430
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
43 ## @end table
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
44 ##
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
45 ## @strong{Outputs}
5016
bdbee5282954 [project @ 2004-09-22 02:50:35 by jwe]
jwe
parents: 4771
diff changeset
46 ## @table @var
bdbee5282954 [project @ 2004-09-22 02:50:35 by jwe]
jwe
parents: 4771
diff changeset
47 ## @item clsys
bdbee5282954 [project @ 2004-09-22 02:50:35 by jwe]
jwe
parents: 4771
diff changeset
48 ## Resulting closed loop system.
bdbee5282954 [project @ 2004-09-22 02:50:35 by jwe]
jwe
parents: 4771
diff changeset
49 ## @end table
3430
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
50 ##
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
51 ## @strong{Method}
5016
bdbee5282954 [project @ 2004-09-22 02:50:35 by jwe]
jwe
parents: 4771
diff changeset
52 ##
3430
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
53 ## @code{sysconnect} internally permutes selected inputs, outputs as shown
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
54 ## below, closes the loop, and then permutes inputs and outputs back to their
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
55 ## original order
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
56 ## @example
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
57 ## @group
5016
bdbee5282954 [project @ 2004-09-22 02:50:35 by jwe]
jwe
parents: 4771
diff changeset
58 ## --------------------
3430
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
59 ## u_1 ----->| |----> y_1
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
60 ## | sys |
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
61 ## old u_2 | |
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
62 ## u_2* ---->(+)--->| |----->y_2
5016
bdbee5282954 [project @ 2004-09-22 02:50:35 by jwe]
jwe
parents: 4771
diff changeset
63 ## (in_idx) ^ -------------------- | (out_idx)
3430
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
64 ## | |
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
65 ## -------------------------------
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
66 ## @end group
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
67 ## @end example
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
68 ## The input that has the summing junction added to it has an * added to
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
69 ## the end of the input name.
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
70 ## @end deftypefn
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
71
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
72 ## Author: A. S. Hodel <a.s.hodel@eng.auburn.edu>
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
73 ## Created: August 1995
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
74 ## modified by John Ingram July 1996
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
75
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
76 function sys = sysconnect (sys, output_list, input_list, order, tol)
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
77
7135
8aa770b6c5bf [project @ 2007-11-08 18:54:10 by jwe]
jwe
parents: 7017
diff changeset
78 if (nargin < 3 || nargin > 5)
6046
34f96dd5441b [project @ 2006-10-10 16:10:25 by jwe]
jwe
parents: 5443
diff changeset
79 print_usage ();
3430
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
80 endif
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
81
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
82 ## check order
7135
8aa770b6c5bf [project @ 2007-11-08 18:54:10 by jwe]
jwe
parents: 7017
diff changeset
83 if (nargin < 4)
3430
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
84 order = 0;
7135
8aa770b6c5bf [project @ 2007-11-08 18:54:10 by jwe]
jwe
parents: 7017
diff changeset
85 elseif (order != 0 && order != 1)
8aa770b6c5bf [project @ 2007-11-08 18:54:10 by jwe]
jwe
parents: 7017
diff changeset
86 error ("sysconnect: order must be either 0 or 1")
3430
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
87 endif
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
88
7135
8aa770b6c5bf [project @ 2007-11-08 18:54:10 by jwe]
jwe
parents: 7017
diff changeset
89 if (nargin < 5)
3430
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
90 tol = 200*eps;
7135
8aa770b6c5bf [project @ 2007-11-08 18:54:10 by jwe]
jwe
parents: 7017
diff changeset
91 elseif (! is_sample (tol))
8aa770b6c5bf [project @ 2007-11-08 18:54:10 by jwe]
jwe
parents: 7017
diff changeset
92 error ("sysconnect: tol must be a positive scalar");
8aa770b6c5bf [project @ 2007-11-08 18:54:10 by jwe]
jwe
parents: 7017
diff changeset
93 elseif (tol > 1e2*sqrt(eps))
8aa770b6c5bf [project @ 2007-11-08 18:54:10 by jwe]
jwe
parents: 7017
diff changeset
94 warning ("sysconnect: tol set to large value=%g, eps=%g", tol, eps);
3430
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
95 endif
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
96
3462
04aef7306dca [project @ 2000-01-19 17:16:43 by hodelas]
hodelas
parents: 3430
diff changeset
97 ## convert signal names to indices
7135
8aa770b6c5bf [project @ 2007-11-08 18:54:10 by jwe]
jwe
parents: 7017
diff changeset
98 if (is_signal_list (input_list) || ischar (input_list))
8aa770b6c5bf [project @ 2007-11-08 18:54:10 by jwe]
jwe
parents: 7017
diff changeset
99 input_list = sysidx (sys, "in", input_list);
3462
04aef7306dca [project @ 2000-01-19 17:16:43 by hodelas]
hodelas
parents: 3430
diff changeset
100 endif
7135
8aa770b6c5bf [project @ 2007-11-08 18:54:10 by jwe]
jwe
parents: 7017
diff changeset
101 if (is_signal_list (output_list) || ischar (output_list))
8aa770b6c5bf [project @ 2007-11-08 18:54:10 by jwe]
jwe
parents: 7017
diff changeset
102 output_list = sysidx (sys, "out", output_list);
3462
04aef7306dca [project @ 2000-01-19 17:16:43 by hodelas]
hodelas
parents: 3430
diff changeset
103 endif
04aef7306dca [project @ 2000-01-19 17:16:43 by hodelas]
hodelas
parents: 3430
diff changeset
104
3430
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
105 ## verify sizes,format of input, output lists
7135
8aa770b6c5bf [project @ 2007-11-08 18:54:10 by jwe]
jwe
parents: 7017
diff changeset
106 if (min (size (output_list)) * min (size (input_list)) != 1)
8aa770b6c5bf [project @ 2007-11-08 18:54:10 by jwe]
jwe
parents: 7017
diff changeset
107 error ("output_list and input_list must be vectors");
3430
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
108 else
7135
8aa770b6c5bf [project @ 2007-11-08 18:54:10 by jwe]
jwe
parents: 7017
diff changeset
109 lo = length (output_list);
8aa770b6c5bf [project @ 2007-11-08 18:54:10 by jwe]
jwe
parents: 7017
diff changeset
110 li = length (input_list);
8aa770b6c5bf [project @ 2007-11-08 18:54:10 by jwe]
jwe
parents: 7017
diff changeset
111 if (lo != li)
8aa770b6c5bf [project @ 2007-11-08 18:54:10 by jwe]
jwe
parents: 7017
diff changeset
112 error ("output_list and input_list must be of the same length")
3430
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
113 endif
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
114
7135
8aa770b6c5bf [project @ 2007-11-08 18:54:10 by jwe]
jwe
parents: 7017
diff changeset
115 if (is_duplicate_entry (output_list) || is_duplicate_entry (input_list))
8aa770b6c5bf [project @ 2007-11-08 18:54:10 by jwe]
jwe
parents: 7017
diff changeset
116 error ("duplicate entry in input_list and/or output_list");
3430
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
117 endif
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
118 endif
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
119
7135
8aa770b6c5bf [project @ 2007-11-08 18:54:10 by jwe]
jwe
parents: 7017
diff changeset
120 [nc, nz, mm, pp] = sysdimensions (sys);
3430
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
121 nn = nc+nz;
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
122
7135
8aa770b6c5bf [project @ 2007-11-08 18:54:10 by jwe]
jwe
parents: 7017
diff changeset
123 if (! isstruct (sys))
8aa770b6c5bf [project @ 2007-11-08 18:54:10 by jwe]
jwe
parents: 7017
diff changeset
124 error ("sys must be in structured system form")
8aa770b6c5bf [project @ 2007-11-08 18:54:10 by jwe]
jwe
parents: 7017
diff changeset
125 elseif (pp < lo)
8aa770b6c5bf [project @ 2007-11-08 18:54:10 by jwe]
jwe
parents: 7017
diff changeset
126 error ("length(output_list)=%d, sys has only %d system outputs", lo, pp);
8aa770b6c5bf [project @ 2007-11-08 18:54:10 by jwe]
jwe
parents: 7017
diff changeset
127 elseif (mm < li)
8aa770b6c5bf [project @ 2007-11-08 18:54:10 by jwe]
jwe
parents: 7017
diff changeset
128 error ("length(input_list)=%d, sys has only %d system inputs", li, mm);
3430
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
129 endif
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
130
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
131 ## check that there are enough inputs/outputs in the system for the lists
7135
8aa770b6c5bf [project @ 2007-11-08 18:54:10 by jwe]
jwe
parents: 7017
diff changeset
132 if (max (input_list) > mm)
8aa770b6c5bf [project @ 2007-11-08 18:54:10 by jwe]
jwe
parents: 7017
diff changeset
133 error ("max(input_list) exceeds the number of inputs");
8aa770b6c5bf [project @ 2007-11-08 18:54:10 by jwe]
jwe
parents: 7017
diff changeset
134 elseif (max (output_list) > pp)
8aa770b6c5bf [project @ 2007-11-08 18:54:10 by jwe]
jwe
parents: 7017
diff changeset
135 error ("max(output_list) exceeds the number of outputs");
3430
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
136 endif
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
137
7135
8aa770b6c5bf [project @ 2007-11-08 18:54:10 by jwe]
jwe
parents: 7017
diff changeset
138 output_list = reshape (output_list, 1, length (output_list));
3430
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
139
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
140 ## make sure we're in state space form
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
141 sys = sysupdate (sys, "ss");
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
142
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
143 ## permute rows and columns of B,C,D matrices into pseudo-dgkf form...
7135
8aa770b6c5bf [project @ 2007-11-08 18:54:10 by jwe]
jwe
parents: 7017
diff changeset
144 all_inputs = sysreorder (mm, input_list);
8aa770b6c5bf [project @ 2007-11-08 18:54:10 by jwe]
jwe
parents: 7017
diff changeset
145 all_outputs = sysreorder (pp, output_list);
3430
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
146
7135
8aa770b6c5bf [project @ 2007-11-08 18:54:10 by jwe]
jwe
parents: 7017
diff changeset
147 [aa, bb, cc, dd] = sys2ss (sys);
3430
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
148 bb = bb(:,all_inputs);
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
149 cc = cc(all_outputs,:);
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
150 dd = dd(all_outputs,all_inputs);
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
151
7135
8aa770b6c5bf [project @ 2007-11-08 18:54:10 by jwe]
jwe
parents: 7017
diff changeset
152 yd = sysgetsignals (sys, "yd");
3430
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
153 yd = yd(all_outputs);
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
154
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
155 ## m1, p1 = number of inputs, outputs that are not being connected
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
156 m1 = mm-li;
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
157 p1 = pp-li;
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
158
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
159 ## m2, p2: 1st column, row of B, C that is being connected
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
160 m2 = m1+1;
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
161 p2 = p1+1;
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
162
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
163 ## partition system into a DGKF-like form; the loop is closed around
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
164 ## B2, C2
7135
8aa770b6c5bf [project @ 2007-11-08 18:54:10 by jwe]
jwe
parents: 7017
diff changeset
165 if (m1 > 0)
3430
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
166 B1 = bb(:,1:m1);
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
167 D21= dd(p2:pp,1:m1);
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
168 endif
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
169 B2 = bb(:,m2:mm);
7135
8aa770b6c5bf [project @ 2007-11-08 18:54:10 by jwe]
jwe
parents: 7017
diff changeset
170 if (p1 > 0)
3430
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
171 C1 = cc(1:p1,:);
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
172 D12= dd(1:p1,m2:mm);
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
173 endif
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
174 C2 = cc(p2:pp,:);
7135
8aa770b6c5bf [project @ 2007-11-08 18:54:10 by jwe]
jwe
parents: 7017
diff changeset
175 if (m1*p1 > 0)
8aa770b6c5bf [project @ 2007-11-08 18:54:10 by jwe]
jwe
parents: 7017
diff changeset
176 D11 = dd(1:p1,1:m1);
3430
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
177 endif
7135
8aa770b6c5bf [project @ 2007-11-08 18:54:10 by jwe]
jwe
parents: 7017
diff changeset
178 D22 = dd(p2:pp,m2:mm);
3430
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
179
7135
8aa770b6c5bf [project @ 2007-11-08 18:54:10 by jwe]
jwe
parents: 7017
diff changeset
180 if (norm (D22))
8aa770b6c5bf [project @ 2007-11-08 18:54:10 by jwe]
jwe
parents: 7017
diff changeset
181 warning ("sysconnect: possible algebraic loop, D22 non-zero");
8aa770b6c5bf [project @ 2007-11-08 18:54:10 by jwe]
jwe
parents: 7017
diff changeset
182 D22i = eye (size (D22)) - D22;
3430
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
183 C2h = D22i\C2;
7135
8aa770b6c5bf [project @ 2007-11-08 18:54:10 by jwe]
jwe
parents: 7017
diff changeset
184 if (m1 > 0)
3430
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
185 D21h = D22i\D21;
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
186 endif
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
187 D22h = D22i\D22;
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
188 else
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
189 C2h = C2;
7135
8aa770b6c5bf [project @ 2007-11-08 18:54:10 by jwe]
jwe
parents: 7017
diff changeset
190 if (m1 > 0)
3430
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
191 D21h = D21;
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
192 endif
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
193 D22h = D22;
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
194
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
195 endif
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
196
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
197 ## check cont state -> disc output -> cont state
7135
8aa770b6c5bf [project @ 2007-11-08 18:54:10 by jwe]
jwe
parents: 7017
diff changeset
198 dyi = find (yd(p2:pp));
3430
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
199
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
200 ## disp("sysconnect: dyi=")
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
201 ## dyi
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
202 ## nc
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
203 ## disp("/sysconnect");
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
204
7137
38fe664f0ef1 [project @ 2007-11-08 20:26:32 by jwe]
jwe
parents: 7135
diff changeset
205 if ((nc > 0) & find (dyi > 0))
3430
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
206 B2con = B2(1:nc,dyi); # connection to cont states
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
207 C2hd = C2h(dyi,1:nc); # cont states -> outputs
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
208 else
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
209 B2con = C2hd = [];
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
210 endif
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
211
7135
8aa770b6c5bf [project @ 2007-11-08 18:54:10 by jwe]
jwe
parents: 7017
diff changeset
212 if (max (size (B2con)) & max (size (C2hd)))
8aa770b6c5bf [project @ 2007-11-08 18:54:10 by jwe]
jwe
parents: 7017
diff changeset
213 if (norm (B2con*C2hd))
8aa770b6c5bf [project @ 2007-11-08 18:54:10 by jwe]
jwe
parents: 7017
diff changeset
214 warning ("sysconnect: cont-state -> disc output -> cont state derivative");
8aa770b6c5bf [project @ 2007-11-08 18:54:10 by jwe]
jwe
parents: 7017
diff changeset
215 warning ("connection made; resulting system may not be meaningful");
3430
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
216 endif
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
217 endif
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
218
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
219 Ac = aa+B2*C2h;
7135
8aa770b6c5bf [project @ 2007-11-08 18:54:10 by jwe]
jwe
parents: 7017
diff changeset
220 if (m1 > 0)
3430
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
221 B1c = B1 + B2*D21h;
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
222 endif
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
223 B2c = B2*(eye(size(D22h)) + D22h);
7135
8aa770b6c5bf [project @ 2007-11-08 18:54:10 by jwe]
jwe
parents: 7017
diff changeset
224 if (p1*m1 > 0)
3430
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
225 D11c = D11 + D12*D21h;
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
226 endif
7135
8aa770b6c5bf [project @ 2007-11-08 18:54:10 by jwe]
jwe
parents: 7017
diff changeset
227 if (p1 > 0)
3430
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
228 C1c = C1+D12*C2h;
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
229 D12c = D12*(eye(size(D22h))+D22h);
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
230 endif
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
231
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
232 ## construct system data structure
7135
8aa770b6c5bf [project @ 2007-11-08 18:54:10 by jwe]
jwe
parents: 7017
diff changeset
233 if (m1 > 0)
3430
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
234 Bc = [B1c, B2c];
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
235 else
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
236 Bc = B2c;
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
237 endif
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
238
7135
8aa770b6c5bf [project @ 2007-11-08 18:54:10 by jwe]
jwe
parents: 7017
diff changeset
239 if (p1 > 0)
3430
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
240 Cc = [C1c;C2h];
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
241 else
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
242 Cc = C2h;
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
243 endif
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
244
7135
8aa770b6c5bf [project @ 2007-11-08 18:54:10 by jwe]
jwe
parents: 7017
diff changeset
245 if (m1*p1 > 0)
3430
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
246 Dc = [D11c,D12c; D21h,D22h];
7135
8aa770b6c5bf [project @ 2007-11-08 18:54:10 by jwe]
jwe
parents: 7017
diff changeset
247 elseif (m1 > 0)
3430
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
248 Dc = [D21h, D22h];
7135
8aa770b6c5bf [project @ 2007-11-08 18:54:10 by jwe]
jwe
parents: 7017
diff changeset
249 elseif (p1 > 0)
3430
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
250 Dc = [D12c; D22h];
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
251 else
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
252 Dc = D22h;
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
253 endif
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
254
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
255 ## permute rows and columns of Bc, Cc, Dc back into original order
7135
8aa770b6c5bf [project @ 2007-11-08 18:54:10 by jwe]
jwe
parents: 7017
diff changeset
256 Im = eye (mm, mm);
3430
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
257 Pi = Im(:,all_inputs);
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
258 back_inputs = Pi*[1:mm]';
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
259
7135
8aa770b6c5bf [project @ 2007-11-08 18:54:10 by jwe]
jwe
parents: 7017
diff changeset
260 Ip = eye (pp, pp);
3430
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
261 Po = Ip(:,all_outputs);
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
262 back_outputs = Po*[1:pp]';
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
263
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
264 Bc = Bc(:,back_inputs);
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
265 Cc = Cc(back_outputs,:);
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
266 Dc = Dc(back_outputs,back_inputs);
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
267 yd = yd(back_outputs);
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
268
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
269 ## rebuild system
7135
8aa770b6c5bf [project @ 2007-11-08 18:54:10 by jwe]
jwe
parents: 7017
diff changeset
270 Ts = sysgettsam (sys);
8aa770b6c5bf [project @ 2007-11-08 18:54:10 by jwe]
jwe
parents: 7017
diff changeset
271 [stnam, innam, outnam] = sysgetsignals (sys);
8aa770b6c5bf [project @ 2007-11-08 18:54:10 by jwe]
jwe
parents: 7017
diff changeset
272 sys = ss (Ac, Bc, Cc, Dc, Ts, nc, nz, stnam, innam, outnam, find (yd));
3430
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
273
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
274 ## update connected input names
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
275 for ii = 1:length(input_list)
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
276 idx = input_list(ii);
7135
8aa770b6c5bf [project @ 2007-11-08 18:54:10 by jwe]
jwe
parents: 7017
diff changeset
277 tmpval = sysgetsignals (sys, "in", idx);
8aa770b6c5bf [project @ 2007-11-08 18:54:10 by jwe]
jwe
parents: 7017
diff changeset
278 strval = sprintf ("%s*", tmpval{1} );
8aa770b6c5bf [project @ 2007-11-08 18:54:10 by jwe]
jwe
parents: 7017
diff changeset
279 sys = syssetsignals (sys, "in", strval, idx);
3430
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
280 endfor
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
281
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
282 ## maintain original system type if it was SISO
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
283 if (strcmp (sysgettype (sys), "tf"))
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
284 sysupdate (sys, "tf");
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
285 elseif (strcmp (sysgettype (sys),"zp"))
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
286 sysupdate (sys, "zp");
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
287 endif
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
288
65b3519ac3a1 [project @ 2000-01-14 03:44:03 by jwe]
jwe
parents:
diff changeset
289 endfunction