annotate scripts/control/lyap.m @ 245:16a24e76d6e0

[project @ 1993-12-03 02:00:15 by jwe]
author jwe
date Fri, 03 Dec 1993 02:00:15 +0000
parents f3c9042fd609
children 3470f1e25a79
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
245
16a24e76d6e0 [project @ 1993-12-03 02:00:15 by jwe]
jwe
parents: 73
diff changeset
1 # Copyright (C) 1993 John W. Eaton
16a24e76d6e0 [project @ 1993-12-03 02:00:15 by jwe]
jwe
parents: 73
diff changeset
2 #
16a24e76d6e0 [project @ 1993-12-03 02:00:15 by jwe]
jwe
parents: 73
diff changeset
3 # This file is part of Octave.
16a24e76d6e0 [project @ 1993-12-03 02:00:15 by jwe]
jwe
parents: 73
diff changeset
4 #
16a24e76d6e0 [project @ 1993-12-03 02:00:15 by jwe]
jwe
parents: 73
diff changeset
5 # Octave is free software; you can redistribute it and/or modify it
16a24e76d6e0 [project @ 1993-12-03 02:00:15 by jwe]
jwe
parents: 73
diff changeset
6 # under the terms of the GNU General Public License as published by the
16a24e76d6e0 [project @ 1993-12-03 02:00:15 by jwe]
jwe
parents: 73
diff changeset
7 # Free Software Foundation; either version 2, or (at your option) any
16a24e76d6e0 [project @ 1993-12-03 02:00:15 by jwe]
jwe
parents: 73
diff changeset
8 # later version.
16a24e76d6e0 [project @ 1993-12-03 02:00:15 by jwe]
jwe
parents: 73
diff changeset
9 #
16a24e76d6e0 [project @ 1993-12-03 02:00:15 by jwe]
jwe
parents: 73
diff changeset
10 # Octave is distributed in the hope that it will be useful, but WITHOUT
16a24e76d6e0 [project @ 1993-12-03 02:00:15 by jwe]
jwe
parents: 73
diff changeset
11 # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
16a24e76d6e0 [project @ 1993-12-03 02:00:15 by jwe]
jwe
parents: 73
diff changeset
12 # FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
16a24e76d6e0 [project @ 1993-12-03 02:00:15 by jwe]
jwe
parents: 73
diff changeset
13 # for more details.
16a24e76d6e0 [project @ 1993-12-03 02:00:15 by jwe]
jwe
parents: 73
diff changeset
14 #
16a24e76d6e0 [project @ 1993-12-03 02:00:15 by jwe]
jwe
parents: 73
diff changeset
15 # You should have received a copy of the GNU General Public License
16a24e76d6e0 [project @ 1993-12-03 02:00:15 by jwe]
jwe
parents: 73
diff changeset
16 # along with Octave; see the file COPYING. If not, write to the Free
16a24e76d6e0 [project @ 1993-12-03 02:00:15 by jwe]
jwe
parents: 73
diff changeset
17 # Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
16a24e76d6e0 [project @ 1993-12-03 02:00:15 by jwe]
jwe
parents: 73
diff changeset
18
53
4565ad8b4697 [project @ 1993-08-11 21:21:34 by jwe]
jwe
parents: 40
diff changeset
19 function x = lyap (a, b, c)
40
adade67872a7 [project @ 1993-08-10 22:15:36 by jwe]
jwe
parents:
diff changeset
20
73
f3c9042fd609 [project @ 1993-08-30 14:49:08 by jwe]
jwe
parents: 57
diff changeset
21 # Usage: x = lyap (a, b {,c})
53
4565ad8b4697 [project @ 1993-08-11 21:21:34 by jwe]
jwe
parents: 40
diff changeset
22 #
4565ad8b4697 [project @ 1993-08-11 21:21:34 by jwe]
jwe
parents: 40
diff changeset
23 # If (a, b, c) are specified, then lyap returns the solution of the
4565ad8b4697 [project @ 1993-08-11 21:21:34 by jwe]
jwe
parents: 40
diff changeset
24 # Sylvester equation
4565ad8b4697 [project @ 1993-08-11 21:21:34 by jwe]
jwe
parents: 40
diff changeset
25 #
4565ad8b4697 [project @ 1993-08-11 21:21:34 by jwe]
jwe
parents: 40
diff changeset
26 # a x + x b + c = 0
4565ad8b4697 [project @ 1993-08-11 21:21:34 by jwe]
jwe
parents: 40
diff changeset
27 #
4565ad8b4697 [project @ 1993-08-11 21:21:34 by jwe]
jwe
parents: 40
diff changeset
28 # If only (a, b) are specified, then lyap returns the solution of the
4565ad8b4697 [project @ 1993-08-11 21:21:34 by jwe]
jwe
parents: 40
diff changeset
29 # Lyapunov equation
4565ad8b4697 [project @ 1993-08-11 21:21:34 by jwe]
jwe
parents: 40
diff changeset
30 #
4565ad8b4697 [project @ 1993-08-11 21:21:34 by jwe]
jwe
parents: 40
diff changeset
31 # a' x + x a + b = 0
4565ad8b4697 [project @ 1993-08-11 21:21:34 by jwe]
jwe
parents: 40
diff changeset
32 #
4565ad8b4697 [project @ 1993-08-11 21:21:34 by jwe]
jwe
parents: 40
diff changeset
33 # If b is not square, then lyap returns the solution of either
4565ad8b4697 [project @ 1993-08-11 21:21:34 by jwe]
jwe
parents: 40
diff changeset
34 #
4565ad8b4697 [project @ 1993-08-11 21:21:34 by jwe]
jwe
parents: 40
diff changeset
35 # a' x + x a + b' b = 0
4565ad8b4697 [project @ 1993-08-11 21:21:34 by jwe]
jwe
parents: 40
diff changeset
36 #
4565ad8b4697 [project @ 1993-08-11 21:21:34 by jwe]
jwe
parents: 40
diff changeset
37 # or
4565ad8b4697 [project @ 1993-08-11 21:21:34 by jwe]
jwe
parents: 40
diff changeset
38 #
4565ad8b4697 [project @ 1993-08-11 21:21:34 by jwe]
jwe
parents: 40
diff changeset
39 # a x + x a' + b b' = 0
4565ad8b4697 [project @ 1993-08-11 21:21:34 by jwe]
jwe
parents: 40
diff changeset
40 #
4565ad8b4697 [project @ 1993-08-11 21:21:34 by jwe]
jwe
parents: 40
diff changeset
41 # whichever is appropriate.
73
f3c9042fd609 [project @ 1993-08-30 14:49:08 by jwe]
jwe
parents: 57
diff changeset
42 #
f3c9042fd609 [project @ 1993-08-30 14:49:08 by jwe]
jwe
parents: 57
diff changeset
43 # Solves by using the Bartels-Stewart algorithm (1972).
f3c9042fd609 [project @ 1993-08-30 14:49:08 by jwe]
jwe
parents: 57
diff changeset
44
f3c9042fd609 [project @ 1993-08-30 14:49:08 by jwe]
jwe
parents: 57
diff changeset
45 # Written by A. S. Hodel (scotte@eng.auburn.edu) August 1993.
f3c9042fd609 [project @ 1993-08-30 14:49:08 by jwe]
jwe
parents: 57
diff changeset
46
40
adade67872a7 [project @ 1993-08-10 22:15:36 by jwe]
jwe
parents:
diff changeset
47
53
4565ad8b4697 [project @ 1993-08-11 21:21:34 by jwe]
jwe
parents: 40
diff changeset
48 if (nargin != 3 && nargin != 2)
57
8d4431f4a00a [project @ 1993-08-11 21:53:44 by jwe]
jwe
parents: 53
diff changeset
49 error ("usage: lyap (a, b {,c})");
53
4565ad8b4697 [project @ 1993-08-11 21:21:34 by jwe]
jwe
parents: 40
diff changeset
50 endif
4565ad8b4697 [project @ 1993-08-11 21:21:34 by jwe]
jwe
parents: 40
diff changeset
51
4565ad8b4697 [project @ 1993-08-11 21:21:34 by jwe]
jwe
parents: 40
diff changeset
52 if ((n = is_square(a)) == 0)
4565ad8b4697 [project @ 1993-08-11 21:21:34 by jwe]
jwe
parents: 40
diff changeset
53 error ("lyap: a is not square");
4565ad8b4697 [project @ 1993-08-11 21:21:34 by jwe]
jwe
parents: 40
diff changeset
54 endif
4565ad8b4697 [project @ 1993-08-11 21:21:34 by jwe]
jwe
parents: 40
diff changeset
55
4565ad8b4697 [project @ 1993-08-11 21:21:34 by jwe]
jwe
parents: 40
diff changeset
56 if (nargin == 2)
40
adade67872a7 [project @ 1993-08-10 22:15:36 by jwe]
jwe
parents:
diff changeset
57
53
4565ad8b4697 [project @ 1993-08-11 21:21:34 by jwe]
jwe
parents: 40
diff changeset
58 # Transform Lyapunov equation to Sylvester equation form.
4565ad8b4697 [project @ 1993-08-11 21:21:34 by jwe]
jwe
parents: 40
diff changeset
59
4565ad8b4697 [project @ 1993-08-11 21:21:34 by jwe]
jwe
parents: 40
diff changeset
60 if ((m = is_square (b)) == 0)
4565ad8b4697 [project @ 1993-08-11 21:21:34 by jwe]
jwe
parents: 40
diff changeset
61 if ((m = rows (b)) == n)
4565ad8b4697 [project @ 1993-08-11 21:21:34 by jwe]
jwe
parents: 40
diff changeset
62
4565ad8b4697 [project @ 1993-08-11 21:21:34 by jwe]
jwe
parents: 40
diff changeset
63 # solve a x + x a' + b b' = 0
4565ad8b4697 [project @ 1993-08-11 21:21:34 by jwe]
jwe
parents: 40
diff changeset
64
4565ad8b4697 [project @ 1993-08-11 21:21:34 by jwe]
jwe
parents: 40
diff changeset
65 b = b * b';
4565ad8b4697 [project @ 1993-08-11 21:21:34 by jwe]
jwe
parents: 40
diff changeset
66 a = a';
4565ad8b4697 [project @ 1993-08-11 21:21:34 by jwe]
jwe
parents: 40
diff changeset
67 else
4565ad8b4697 [project @ 1993-08-11 21:21:34 by jwe]
jwe
parents: 40
diff changeset
68
4565ad8b4697 [project @ 1993-08-11 21:21:34 by jwe]
jwe
parents: 40
diff changeset
69 # Try to solve a'x + x a + b' b = 0.
4565ad8b4697 [project @ 1993-08-11 21:21:34 by jwe]
jwe
parents: 40
diff changeset
70
4565ad8b4697 [project @ 1993-08-11 21:21:34 by jwe]
jwe
parents: 40
diff changeset
71 m = columns (b);
4565ad8b4697 [project @ 1993-08-11 21:21:34 by jwe]
jwe
parents: 40
diff changeset
72 b = b' * b;
4565ad8b4697 [project @ 1993-08-11 21:21:34 by jwe]
jwe
parents: 40
diff changeset
73 endif
40
adade67872a7 [project @ 1993-08-10 22:15:36 by jwe]
jwe
parents:
diff changeset
74
53
4565ad8b4697 [project @ 1993-08-11 21:21:34 by jwe]
jwe
parents: 40
diff changeset
75 if (m != n)
4565ad8b4697 [project @ 1993-08-11 21:21:34 by jwe]
jwe
parents: 40
diff changeset
76 error ("lyap: a, b not conformably dimensioned");
4565ad8b4697 [project @ 1993-08-11 21:21:34 by jwe]
jwe
parents: 40
diff changeset
77 endif
40
adade67872a7 [project @ 1993-08-10 22:15:36 by jwe]
jwe
parents:
diff changeset
78 endif
53
4565ad8b4697 [project @ 1993-08-11 21:21:34 by jwe]
jwe
parents: 40
diff changeset
79
4565ad8b4697 [project @ 1993-08-11 21:21:34 by jwe]
jwe
parents: 40
diff changeset
80 # Set up Sylvester equation.
4565ad8b4697 [project @ 1993-08-11 21:21:34 by jwe]
jwe
parents: 40
diff changeset
81
4565ad8b4697 [project @ 1993-08-11 21:21:34 by jwe]
jwe
parents: 40
diff changeset
82 c = b;
4565ad8b4697 [project @ 1993-08-11 21:21:34 by jwe]
jwe
parents: 40
diff changeset
83 b = a;
4565ad8b4697 [project @ 1993-08-11 21:21:34 by jwe]
jwe
parents: 40
diff changeset
84 a = b'
4565ad8b4697 [project @ 1993-08-11 21:21:34 by jwe]
jwe
parents: 40
diff changeset
85
4565ad8b4697 [project @ 1993-08-11 21:21:34 by jwe]
jwe
parents: 40
diff changeset
86 else
4565ad8b4697 [project @ 1993-08-11 21:21:34 by jwe]
jwe
parents: 40
diff changeset
87
4565ad8b4697 [project @ 1993-08-11 21:21:34 by jwe]
jwe
parents: 40
diff changeset
88 # Check dimensions.
4565ad8b4697 [project @ 1993-08-11 21:21:34 by jwe]
jwe
parents: 40
diff changeset
89
4565ad8b4697 [project @ 1993-08-11 21:21:34 by jwe]
jwe
parents: 40
diff changeset
90 if ((m = is_square (b)) == 0)
4565ad8b4697 [project @ 1993-08-11 21:21:34 by jwe]
jwe
parents: 40
diff changeset
91 error ("lyap: b must be square in a sylvester equation");
40
adade67872a7 [project @ 1993-08-10 22:15:36 by jwe]
jwe
parents:
diff changeset
92 endif
53
4565ad8b4697 [project @ 1993-08-11 21:21:34 by jwe]
jwe
parents: 40
diff changeset
93
73
f3c9042fd609 [project @ 1993-08-30 14:49:08 by jwe]
jwe
parents: 57
diff changeset
94 [n1, m1] = size(c);
53
4565ad8b4697 [project @ 1993-08-11 21:21:34 by jwe]
jwe
parents: 40
diff changeset
95
4565ad8b4697 [project @ 1993-08-11 21:21:34 by jwe]
jwe
parents: 40
diff changeset
96 if (n != n1 || m != m1)
4565ad8b4697 [project @ 1993-08-11 21:21:34 by jwe]
jwe
parents: 40
diff changeset
97 error("lyap: a,b,c not conformably dimensioned");
4565ad8b4697 [project @ 1993-08-11 21:21:34 by jwe]
jwe
parents: 40
diff changeset
98 endif;
40
adade67872a7 [project @ 1993-08-10 22:15:36 by jwe]
jwe
parents:
diff changeset
99 endif
adade67872a7 [project @ 1993-08-10 22:15:36 by jwe]
jwe
parents:
diff changeset
100
53
4565ad8b4697 [project @ 1993-08-11 21:21:34 by jwe]
jwe
parents: 40
diff changeset
101 # Call octave built-in function.
40
adade67872a7 [project @ 1993-08-10 22:15:36 by jwe]
jwe
parents:
diff changeset
102
73
f3c9042fd609 [project @ 1993-08-30 14:49:08 by jwe]
jwe
parents: 57
diff changeset
103 x = syl (a, b, c);
40
adade67872a7 [project @ 1993-08-10 22:15:36 by jwe]
jwe
parents:
diff changeset
104
adade67872a7 [project @ 1993-08-10 22:15:36 by jwe]
jwe
parents:
diff changeset
105 endfunction