annotate scripts/control/is_controllable.m @ 26:e90ea9cbd4de

[project @ 1993-08-10 20:56:55 by jwe] Initial revision
author jwe
date Tue, 10 Aug 1993 20:56:55 +0000
parents
children 3cccff82b7a6
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 #
e90ea9cbd4de [project @ 1993-08-10 20:56:55 by jwe]
jwe
parents:
diff changeset
5 # returns 1 the pair(a,b) is controllable, then return value is the
e90ea9cbd4de [project @ 1993-08-10 20:56:55 by jwe]
jwe
parents:
diff changeset
6 # dimension of x. 0therwise, returns a value of 0
e90ea9cbd4de [project @ 1993-08-10 20:56:55 by jwe]
jwe
parents:
diff changeset
7 #
e90ea9cbd4de [project @ 1993-08-10 20:56:55 by jwe]
jwe
parents:
diff changeset
8 # 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
9
e90ea9cbd4de [project @ 1993-08-10 20:56:55 by jwe]
jwe
parents:
diff changeset
10 # 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
11 #
e90ea9cbd4de [project @ 1993-08-10 20:56:55 by jwe]
jwe
parents:
diff changeset
12 # Controllability is determined by applying Arnoldi iteration with complete
e90ea9cbd4de [project @ 1993-08-10 20:56:55 by jwe]
jwe
parents:
diff changeset
13 # re-orthogonalization to obtain an orthogonal basis of the Krylov subspace
e90ea9cbd4de [project @ 1993-08-10 20:56:55 by jwe]
jwe
parents:
diff changeset
14 # n-1
e90ea9cbd4de [project @ 1993-08-10 20:56:55 by jwe]
jwe
parents:
diff changeset
15 # span([b,a*b,...,a^ b]). tol is a roundoff paramter,
e90ea9cbd4de [project @ 1993-08-10 20:56:55 by jwe]
jwe
parents:
diff changeset
16 # set to 2*eps if omitted
e90ea9cbd4de [project @ 1993-08-10 20:56:55 by jwe]
jwe
parents:
diff changeset
17
e90ea9cbd4de [project @ 1993-08-10 20:56:55 by jwe]
jwe
parents:
diff changeset
18 if ((nargin == 2) || (nargin == 3))
e90ea9cbd4de [project @ 1993-08-10 20:56:55 by jwe]
jwe
parents:
diff changeset
19 n = is_square(a);
e90ea9cbd4de [project @ 1993-08-10 20:56:55 by jwe]
jwe
parents:
diff changeset
20 [nr, nc] = size (b);
e90ea9cbd4de [project @ 1993-08-10 20:56:55 by jwe]
jwe
parents:
diff changeset
21 if((n == 0) || (n != nr) || (nc == 0))
e90ea9cbd4de [project @ 1993-08-10 20:56:55 by jwe]
jwe
parents:
diff changeset
22 retval = 0;
e90ea9cbd4de [project @ 1993-08-10 20:56:55 by jwe]
jwe
parents:
diff changeset
23 else
e90ea9cbd4de [project @ 1993-08-10 20:56:55 by jwe]
jwe
parents:
diff changeset
24
e90ea9cbd4de [project @ 1993-08-10 20:56:55 by jwe]
jwe
parents:
diff changeset
25 m = b;
e90ea9cbd4de [project @ 1993-08-10 20:56:55 by jwe]
jwe
parents:
diff changeset
26 tmp = b;
e90ea9cbd4de [project @ 1993-08-10 20:56:55 by jwe]
jwe
parents:
diff changeset
27 for ii=1:(n-1)
e90ea9cbd4de [project @ 1993-08-10 20:56:55 by jwe]
jwe
parents:
diff changeset
28 tmp = a*tmp;
e90ea9cbd4de [project @ 1993-08-10 20:56:55 by jwe]
jwe
parents:
diff changeset
29 m = [m,tmp];
e90ea9cbd4de [project @ 1993-08-10 20:56:55 by jwe]
jwe
parents:
diff changeset
30 endfor
e90ea9cbd4de [project @ 1993-08-10 20:56:55 by jwe]
jwe
parents:
diff changeset
31
e90ea9cbd4de [project @ 1993-08-10 20:56:55 by jwe]
jwe
parents:
diff changeset
32 # if n is of any significant size, m will be low rank, so be careful!
e90ea9cbd4de [project @ 1993-08-10 20:56:55 by jwe]
jwe
parents:
diff changeset
33 if(nargin == 3)
e90ea9cbd4de [project @ 1993-08-10 20:56:55 by jwe]
jwe
parents:
diff changeset
34 if(is_scalar(tol))
e90ea9cbd4de [project @ 1993-08-10 20:56:55 by jwe]
jwe
parents:
diff changeset
35 retval = (rank(m,tol) == n);
e90ea9cbd4de [project @ 1993-08-10 20:56:55 by jwe]
jwe
parents:
diff changeset
36 else
e90ea9cbd4de [project @ 1993-08-10 20:56:55 by jwe]
jwe
parents:
diff changeset
37 error('is_controllable: tol must be a scalar')
e90ea9cbd4de [project @ 1993-08-10 20:56:55 by jwe]
jwe
parents:
diff changeset
38 endif
e90ea9cbd4de [project @ 1993-08-10 20:56:55 by jwe]
jwe
parents:
diff changeset
39 else
e90ea9cbd4de [project @ 1993-08-10 20:56:55 by jwe]
jwe
parents:
diff changeset
40 retval = (rank(m) == n);
e90ea9cbd4de [project @ 1993-08-10 20:56:55 by jwe]
jwe
parents:
diff changeset
41 endif
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
e90ea9cbd4de [project @ 1993-08-10 20:56:55 by jwe]
jwe
parents:
diff changeset
44 error ("usage: is_controllable (a,b)");
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
e90ea9cbd4de [project @ 1993-08-10 20:56:55 by jwe]
jwe
parents:
diff changeset
47 endfunction