view scripts/control/lyap.m @ 40:adade67872a7

[project @ 1993-08-10 22:15:36 by jwe] Initial revision
author jwe
date Tue, 10 Aug 1993 22:15:36 +0000
parents
children 4565ad8b4697
line wrap: on
line source

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.

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)
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;
    endif
    if(m ~= n)
      error("lyap: a, b not conformably dimensioned");
      return;
    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
x = syl(a,b,c);

disp('LYAP ERR')
a*x + x*b + c
a=a
b=b
c=c
endfunction