schur
schur — [ordered] Schur decomposition of matrix and pencils
Calling sequence
[U,T] = schur(A)
[U,dim [,T] ]=schur(A,flag)
[U,dim [,T] ]=schur(A,extern1)
[As,Es [,Q,Z]]=schur(A,E)
[As,Es [,Q],Z,dim] = schur(A,E,flag)
[Z,dim] = schur(A,E,flag)
[As,Es [,Q],Z,dim]= schur(A,E,extern2)
[Z,dim]= schur(A,E,extern2)
Parameters
A | : real or complex square matrix. |
E | : real or complex square matrix with same dimensions as A. |
flag | : character string ('c' or 'd') |
extern1 | : an ``external'', see below |
extern2 | : an ``external'', see below |
U | : orthogonal or unitary square matrix |
Q | : orthogonal or unitary square matrix |
Z | : orthogonal or unitary square matrix |
T | : upper triangular or quasi-triangular square matrix |
As | : upper triangular or quasi-triangular square matrix |
Es | : upper triangular square matrix |
dim | : integer |
Description
Schur forms, ordered Schur forms of matrices and pencils
MATRIX SCHUR FORM | Usual schur form: | [U,T] = schur(A) produces a Schur matrix
T and a unitary matrix U so that
A = U*T*U' and U'*U =
eye(U). By itself, schur(A) returns
T. If A is complex, the Complex
Schur Form is returned in matrix
T. The Complex Schur Form is upper triangular with
the eigenvalues of A on the diagonal. If
A is real, the Real Schur Form is returned. The Real
Schur Form has the real eigenvalues on the diagonal and the
complex eigenvalues in 2-by-2 blocks on the diagonal.
| Ordered Schur forms | [U,dim]=schur(A,'c') returns an unitary
matrix U which transforms A into schur
form. In addition, the dim first columns of U make
a basis of the eigenspace of A associated with
eigenvalues with negative real parts (stable "continuous
time" eigenspace). [U,dim]=schur(A,'d') returns an unitary
matrix U which transforms A into schur
form. In addition, the dim first columns of
U span a basis of the eigenspace of A
associated with eigenvalues with magnitude lower than 1 (stable
"discrete time" eigenspace).
[U,dim]=schur(A,extern1) returns an unitary matrix
U which transforms A into schur form.
In addition, the dim first columns of
U span a basis of the eigenspace of A
associated with the eigenvalues which are selected by the
external function extern1 (see external for
details). This external can be described by a Scilab function
or by C or Fortran procedure: a Scilab function | If extern1 is described by a Scilab function, it
should have the following calling sequence:
s=extern1(Ev), where Ev is an eigenvalue and
s a boolean. | a C or Fortran procedure | If extern1 is described by a C or Fortran function it
should have the following calling sequence:
int extern1(double *EvR, double *EvI)
where EvR and EvI are eigenvalue real and complex parts.
a true or non zero returned value stands for selected eigenvalue. |
|
|
PENCIL SCHUR FORMS | Usual Pencil Schur form | [As,Es] = schur(A,E) produces a quasi triangular
As matrix and a triangular Es matrix
which are the generalized Schur form of the pair A,
E. [As,Es,Q,Z] = schur(A,E)
returns in addition two unitary matrices
Q and Z such that
As=Q'*A*Z and Es=Q'*E*Z.
| Ordered Schur forms: | [As,Es,Z,dim] = schur(A,E,'c')
returns the real generalized
Schur form of the pencil s*E-A. In addition, the dim first columns
of Z span a basis of the right eigenspace associated with
eigenvalues with negative real parts (stable "continuous
time" generalized eigenspace). [As,Es,Z,dim] = schur(A,E,'d')
returns the real generalized
Schur form of the pencil s*E-A. In addition, the dim first columns
of Z make a basis of the right eigenspace associated with
eigenvalues with magnitude lower than 1 (stable "discrete
time" generalized eigenspace).
[As,Es,Z,dim] = schur(A,E,extern2)
returns the real generalized Schur form of the pencil s*E-A.
In addition, the dim first columns
of Z make a basis of the right eigenspace associated with
eigenvalues of the pencil which are selected according to a
rule which is given by the function extern2. (see external
for details). This external can be described by a Scilab
function or by C or Fortran procedure: A Scilab function | If extern2 is described by a Scilab function, it should
have the following calling sequence:
s=extern2(Alpha,Beta), where Alpha and
Beta defines a generalized eigenvalue and
s a boolean. | C or Fortran procedure | if external extern2 is described by a C or a
Fortran procedure, it should have the following calling
sequence: int extern2(double *AlphaR, double *AlphaI, double *Beta)
if A and E are real and int extern2(double *AlphaR, double *AlphaI, double *BetaR, double *BetaI)
if A or E are complex.
Alpha, and Beta defines the generalized eigenvalue.
a true or non zero returned value stands for selected generalized eigenvalue. |
|
|
References
Matrix schur form computations are based on the Lapack routines DGEES and ZGEES.
Pencil schur form computations are based on the Lapack routines DGGES and ZGGES.
Examples
//SCHUR FORM OF A MATRIX
//----------------------
A=diag([-0.9,-2,2,0.9]);X=rand(A);A=inv(X)*A*X;
[U,T]=schur(A);T
[U,dim,T]=schur(A,'c');
T(1:dim,1:dim) //stable cont. eigenvalues
function t=mytest(Ev),t=abs(Ev)<0.95,endfunction
[U,dim,T]=schur(A,mytest);
T(1:dim,1:dim)
// The same function in C (a Compiler is required)
C=['int mytest(double *EvR, double *EvI) {' //the C code
'if (*EvR * *EvR + *EvI * *EvI < 0.9025) return 1;'
'else return 0; }';]
mputl(C,TMPDIR+'/mytest.c')
//build and link
lp=ilib_for_link('mytest','mytest.o',[],'c',TMPDIR+'/Makefile');
link(lp,'mytest','c');
//run it
[U,dim,T]=schur(A,'mytest');
//SCHUR FORM OF A PENCIL
//----------------------
F=[-1,%s, 0, 1;
0,-1,5-%s, 0;
0, 0,2+%s, 0;
1, 0, 0, -2+%s];
A=coeff(F,0);E=coeff(F,1);
[As,Es,Q,Z]=schur(A,E);
Q'*F*Z //It is As+%s*Es
[As,Es,Z,dim] = schur(A,E,'c')
function t=mytest(Alpha,Beta),t=real(Alpha)<0,endfunction
[As,Es,Z,dim] = schur(A,E,mytest)
//the same function in Fortran (a Compiler is required)
ftn=['integer function mytestf(ar,ai,b)' //the fortran code
'double precision ar,ai,b'
'mytestf=0'
'if(ar.lt.0.0d0) mytestf=1'
'end']
mputl(' '+ftn,TMPDIR+'/mytestf.f')
//build and link
lp=ilib_for_link('mytestf','mytestf.o',[],'F',TMPDIR+'/Makefile');
link(lp,'mytestf','f');
//run it
[As,Es,Z,dim] = schur(A,E,'mytestf')
See also
spec, bdiag, ricc, pbig, psmall