annotate scripts/control/is_controllable.m @ 56:3cccff82b7a6

[project @ 1993-08-11 21:49:22 by jwe]
author jwe
date Wed, 11 Aug 1993 21:49:27 +0000
parents e90ea9cbd4de
children f3c9042fd609
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
26
e90ea9cbd4de [project @ 1993-08-10 20:56:55 by jwe]
jwe
parents:
diff changeset
1 function retval = is_controllable (a,b,tol)
e90ea9cbd4de [project @ 1993-08-10 20:56:55 by jwe]
jwe
parents:
diff changeset
2
e90ea9cbd4de [project @ 1993-08-10 20:56:55 by jwe]
jwe
parents:
diff changeset
3 # usage: is_controllable (a,b{,tol})
e90ea9cbd4de [project @ 1993-08-10 20:56:55 by jwe]
jwe
parents:
diff changeset
4 #
56
3cccff82b7a6 [project @ 1993-08-11 21:49:22 by jwe]
jwe
parents: 26
diff changeset
5 # Returns 1 if the pair (a, b) is controllable, or 0 if not.
26
e90ea9cbd4de [project @ 1993-08-10 20:56:55 by jwe]
jwe
parents:
diff changeset
6 #
e90ea9cbd4de [project @ 1993-08-10 20:56:55 by jwe]
jwe
parents:
diff changeset
7 # See also: size, rows, columns, length, is_matrix, is_scalar, is_vector
e90ea9cbd4de [project @ 1993-08-10 20:56:55 by jwe]
jwe
parents:
diff changeset
8
e90ea9cbd4de [project @ 1993-08-10 20:56:55 by jwe]
jwe
parents:
diff changeset
9 # This should really use the method below, but I'm being lazy for now:
e90ea9cbd4de [project @ 1993-08-10 20:56:55 by jwe]
jwe
parents:
diff changeset
10 #
56
3cccff82b7a6 [project @ 1993-08-11 21:49:22 by jwe]
jwe
parents: 26
diff changeset
11 # Controllability is determined by applying Arnoldi iteration with
3cccff82b7a6 [project @ 1993-08-11 21:49:22 by jwe]
jwe
parents: 26
diff changeset
12 # complete re-orthogonalization to obtain an orthogonal basis of the
3cccff82b7a6 [project @ 1993-08-11 21:49:22 by jwe]
jwe
parents: 26
diff changeset
13 # Krylov subspace
3cccff82b7a6 [project @ 1993-08-11 21:49:22 by jwe]
jwe
parents: 26
diff changeset
14 # n-1
3cccff82b7a6 [project @ 1993-08-11 21:49:22 by jwe]
jwe
parents: 26
diff changeset
15 # span ([b,a*b,...,a^ b]).
3cccff82b7a6 [project @ 1993-08-11 21:49:22 by jwe]
jwe
parents: 26
diff changeset
16 #
3cccff82b7a6 [project @ 1993-08-11 21:49:22 by jwe]
jwe
parents: 26
diff changeset
17 # tol is a roundoff paramter, set to 2*eps if omitted
26
e90ea9cbd4de [project @ 1993-08-10 20:56:55 by jwe]
jwe
parents:
diff changeset
18
56
3cccff82b7a6 [project @ 1993-08-11 21:49:22 by jwe]
jwe
parents: 26
diff changeset
19 if (nargin == 2 || nargin == 3)
3cccff82b7a6 [project @ 1993-08-11 21:49:22 by jwe]
jwe
parents: 26
diff changeset
20
3cccff82b7a6 [project @ 1993-08-11 21:49:22 by jwe]
jwe
parents: 26
diff changeset
21 n = is_square (a);
26
e90ea9cbd4de [project @ 1993-08-10 20:56:55 by jwe]
jwe
parents:
diff changeset
22 [nr, nc] = size (b);
56
3cccff82b7a6 [project @ 1993-08-11 21:49:22 by jwe]
jwe
parents: 26
diff changeset
23
3cccff82b7a6 [project @ 1993-08-11 21:49:22 by jwe]
jwe
parents: 26
diff changeset
24 if (n == 0 || n != nr || nc == 0)
26
e90ea9cbd4de [project @ 1993-08-10 20:56:55 by jwe]
jwe
parents:
diff changeset
25 retval = 0;
e90ea9cbd4de [project @ 1993-08-10 20:56:55 by jwe]
jwe
parents:
diff changeset
26 else
e90ea9cbd4de [project @ 1993-08-10 20:56:55 by jwe]
jwe
parents:
diff changeset
27
e90ea9cbd4de [project @ 1993-08-10 20:56:55 by jwe]
jwe
parents:
diff changeset
28 m = b;
e90ea9cbd4de [project @ 1993-08-10 20:56:55 by jwe]
jwe
parents:
diff changeset
29 tmp = b;
56
3cccff82b7a6 [project @ 1993-08-11 21:49:22 by jwe]
jwe
parents: 26
diff changeset
30 for ii = 1:(n-1)
3cccff82b7a6 [project @ 1993-08-11 21:49:22 by jwe]
jwe
parents: 26
diff changeset
31 tmp = a * tmp;
3cccff82b7a6 [project @ 1993-08-11 21:49:22 by jwe]
jwe
parents: 26
diff changeset
32 m = [m, tmp];
26
e90ea9cbd4de [project @ 1993-08-10 20:56:55 by jwe]
jwe
parents:
diff changeset
33 endfor
e90ea9cbd4de [project @ 1993-08-10 20:56:55 by jwe]
jwe
parents:
diff changeset
34
56
3cccff82b7a6 [project @ 1993-08-11 21:49:22 by jwe]
jwe
parents: 26
diff changeset
35 # If n is of any significant size, m will be low rank, so be careful!
3cccff82b7a6 [project @ 1993-08-11 21:49:22 by jwe]
jwe
parents: 26
diff changeset
36
3cccff82b7a6 [project @ 1993-08-11 21:49:22 by jwe]
jwe
parents: 26
diff changeset
37 if (nargin == 3)
3cccff82b7a6 [project @ 1993-08-11 21:49:22 by jwe]
jwe
parents: 26
diff changeset
38 if (is_scalar (tol))
3cccff82b7a6 [project @ 1993-08-11 21:49:22 by jwe]
jwe
parents: 26
diff changeset
39 retval = (rank (m, tol) == n);
26
e90ea9cbd4de [project @ 1993-08-10 20:56:55 by jwe]
jwe
parents:
diff changeset
40 else
56
3cccff82b7a6 [project @ 1993-08-11 21:49:22 by jwe]
jwe
parents: 26
diff changeset
41 error ("is_controllable: tol must be a scalar");
26
e90ea9cbd4de [project @ 1993-08-10 20:56:55 by jwe]
jwe
parents:
diff changeset
42 endif
e90ea9cbd4de [project @ 1993-08-10 20:56:55 by jwe]
jwe
parents:
diff changeset
43 else
56
3cccff82b7a6 [project @ 1993-08-11 21:49:22 by jwe]
jwe
parents: 26
diff changeset
44 retval = (rank (m) == n);
26
e90ea9cbd4de [project @ 1993-08-10 20:56:55 by jwe]
jwe
parents:
diff changeset
45 endif
e90ea9cbd4de [project @ 1993-08-10 20:56:55 by jwe]
jwe
parents:
diff changeset
46 endif
e90ea9cbd4de [project @ 1993-08-10 20:56:55 by jwe]
jwe
parents:
diff changeset
47 else
56
3cccff82b7a6 [project @ 1993-08-11 21:49:22 by jwe]
jwe
parents: 26
diff changeset
48 error ("usage: is_controllable (a, b)");
26
e90ea9cbd4de [project @ 1993-08-10 20:56:55 by jwe]
jwe
parents:
diff changeset
49 endif
e90ea9cbd4de [project @ 1993-08-10 20:56:55 by jwe]
jwe
parents:
diff changeset
50
e90ea9cbd4de [project @ 1993-08-10 20:56:55 by jwe]
jwe
parents:
diff changeset
51 endfunction