Mercurial > hg > octave-terminal
changeset 53:4565ad8b4697
[project @ 1993-08-11 21:21:34 by jwe]
author | jwe |
---|---|
date | Wed, 11 Aug 1993 21:21:34 +0000 |
parents | 9eda1009cf95 |
children | 98eb51c870b2 |
files | scripts/control/lyap.m |
diffstat | 1 files changed, 74 insertions(+), 66 deletions(-) [+] |
line wrap: on
line diff
--- a/scripts/control/lyap.m +++ b/scripts/control/lyap.m @@ -1,78 +1,86 @@ -function x = lyap(a,b,c) +function x = lyap (a, b, c) -% usage: x = lyap(a,b{,c}) -% -% If (a,b,c) are specified, then lyap returns the solution of the Sylvester -% equation -% a x + x b + c = 0 -% -% If only (a,b) are specified, then lyap returns the solution of the -% Lyapunov equation -% a' x + x a + b = 0 -% If b is not square, then lyap returns the solution of either -% a' x + x a + b' b = 0 -% or -% a x + x a' + b b' = 0 -% whichever is appropriate. +# usage: x = lyap (a, b {,c}) +# +# If (a, b, c) are specified, then lyap returns the solution of the +# Sylvester equation +# +# a x + x b + c = 0 +# +# If only (a, b) are specified, then lyap returns the solution of the +# Lyapunov equation +# +# a' x + x a + b = 0 +# +# If b is not square, then lyap returns the solution of either +# +# a' x + x a + b' b = 0 +# +# or +# +# a x + x a' + b b' = 0 +# +# whichever is appropriate. -if((nargin ~= 3) && (nargin ~= 2)) - error("lyap: illegal number of arguments") - return -endif + if (nargin != 3 && nargin != 2) + error ("lyap: illegal number of arguments"); + return; + endif + + if ((n = is_square(a)) == 0) + error ("lyap: a is not square"); + return; + endif + + if (nargin == 2) -if( (n = is_square(a)) == 0 ) - error("lyap: a is not square"); - return -endif +# Transform Lyapunov equation to Sylvester equation form. + + if ((m = is_square (b)) == 0) + if ((m = rows (b)) == n) + +# solve a x + x a' + b b' = 0 + + b = b * b'; + a = a'; + else + +# Try to solve a'x + x a + b' b = 0. + + m = columns (b); + b = b' * b; + endif -if(nargin == 2) -disp('LYAP') -a=a -b=b - % transform Lyapunov equation to Sylvester equation form - if ( (m=is_square(b)) == 0) - if( (m=rows(b)) == n) -disp('TYPE CONTROL') - % solve a x + x a' + b b' = 0 - b = b*b'; - a = a'; - else -disp('TYPE OBSERVE') - % (try to ) solve a'x + x a + b' b = 0 - m = columns(b); - b = b'*b; + if (m != n) + error ("lyap: a, b not conformably dimensioned"); + return; + endif endif - if(m ~= n) - error("lyap: a, b not conformably dimensioned"); + +# Set up Sylvester equation. + + c = b; + b = a; + a = b' + + else + +# Check dimensions. + + if ((m = is_square (b)) == 0) + error ("lyap: b must be square in a sylvester equation"); return; endif + + [n1,m1] = size(c); + + if (n != n1 || m != m1) + error("lyap: a,b,c not conformably dimensioned"); + endif; endif - % set up sylvester equation - c = b; - b = a; - a = b' -else - % check dimensions - if( (m = is_square(b)) == 0) - error("lyap: b must be square in a sylvester equation"); - return - endif - [n1,m1] = size(c); - if((n ~= n1) || (m ~= m1)) - error("lyap: a,b,c not conformably dimensioned"); - endif -endif -a -b -c +# Call octave built-in function. -% call octave built-in function -x = syl(a,b,c); + x = syl(a,b,c); -disp('LYAP ERR') -a*x + x*b + c -a=a -b=b -c=c endfunction