Scilab Website | Contribute with GitLab | Mailing list archives | ATOMS toolboxes
Scilab Online Help
2023.1.0 - Português


schur

decomposição (ordenada) de Schur de matrizes e feixes

Seqüência de Chamamento

[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)

Parâmetros

A

matriz quadrada de reais ou complexos

E

matriz quadrada de reais ou complexos com as mesmas dimensões deA.

flag

string ('c' ou'd')

extern1

uma ``external'' (função externa), veja abaixo

extern2

uma ``external'', veja abaixo

U

matriz quadrada ortogonal ou unitária

Q

matriz quadrada ortogonal ou unitária

Z

matriz quadrada ortogonal ou unitária

T

matriz quadrada triangular superior ou quasi-triangular

As

matriz quadrada triangular superior ou quasi-triangular

Es

matriz quadrada triangular superior

dim

inteiro

Descrição

Formas de Schur, formas ordenadas de Schur de matrizes e feixes

FORMA DE SCHUR MATRICIAL
Forma de Schur usual:

[U,T] = schur(A) produz uma matriz de Schur T e uma matriz unitária U tais que A = U*T*U' e U'*U = eye(U). Por si mesmo, schur(A) retorna T. Se A é de complexos, a Forma de Schur Complexa é retornada na matriz T. A Forma de Schur Complexa é triangular superior com os autovalores de A na diagonal. Se A é de reais, a Forma de Schur Real é retornada. A Forma de Schur Real tem autovalores reais na diagonal e os autovalores complexos em blocos 2-por-2 na diagonal.

Formas de Schur ordenadas

[U,dim]=schur(A,'c') rretorna uma matriz unitária U que transforma A em uma forma de Schur. Ainda, as primeiras dim colunas de U formam uma base para o autoespaço de A associado aos autovalores com partes reais negativas (autoespaço de "tempo contínuo" estável).

[U,dim]=schur(A,'d') retorna uma matriz unitária U que transforma A em uma forma de Schur. Ainda, as primeiras dim colunas de U geram uma base do autoespaço de A associado aos autovalores de magnitude menor que 1 (autoespaço de "tempo discreto" estável).

[U,dim]=schur(A,extern1) retorna uma matriz unitária U que transforma A em uma forma de Schur. Ainda, as dim primeiras colunas de U geram uma base para o autoespaço de A associado aos autovalores que são selecionados pela "external" extern1 (veja "external" para detalhes). Esta "external" pode ser descrita por uma função do Scilab ou por um "procedure" de C ou FORTRAN:

Uma Função do Scilab

Se extern1 é descrita por uma função do Scilab, deve ter a seguinte seqüência de chamamento: s=extern1(Ev), onde Ev é um autovalor e s um booleano.

Um "Procedure" C ou FORTRAN

Se extern1 é descrita por uma função de C ou FORTRAN, deve ter a seguinte seqüência de chamamento: int extern1(double *EvR, double *EvI) onde EvR e EvI são partes real e complexa de autovalor. Valor verdadeiro ou diferente de zero retornado significa autovalor selecionado.

FORMAS DE SCHUR DE FEIXES
Forma de Schur de Feixe Usual

[As,Es] = schur(A,E) produz uma matriz As quasi-triangular e uma matriz triangular Es que são a forma generalizada de Schur do par A, E.

[As,Es,Q,Z] = schur(A,E) retorna, ainda, duas matrizes unitárias Q e Z tais que As=Q'*A*Z e Es=Q'*E*Z.

Formas de Schur Ordenadas:

[As,Es,Z,dim] = schur(A,E,'c') retorna a forma real generalizada de Schur do feixe s*E-A. Ainda, as primeiras dim colunas de Z geram uma base para o autoespaço direito associado aos autovalores com partes reais negativas (autoespaço de "tempo contínuo" generalizado).

[As,Es,Z,dim] = schur(A,E,'d')

retorna a forma real generalizada de Schur do feixe s*E-A. Ainda, as dim primeiras colunas de Z formam uma base para o autoespaço direito associado aos autovalores de magnitude menor que 1 (autoespaço de "tempo discreto" generalizado).

[As,Es,Z,dim] = schur(A,E,extern2)

retorna a forma real generalizada de Schur do feixe s*E-A. Ainda, as dim primeiras colunas de Z formam uma base para o autoespaço direito associado aos autovalores do feixe que são selecionados de acordo com a regra que é dada pela "external" extern2. (veja "external" para detalhes). Esta external pode ser descrita por uma função do Scilab ou por um "procedure" de C ou FORTRAN.

Função do Scilab

Se extern2 é descrita por uma função do Scilab, deve ter a seqüência de chamamento: s=extern2(Alpha,Beta), onde Alpha e Beta definem um autovalor generalizado e s um booleano.

Um "Procedure" C ou FORTRAN

Se a "external" extern2 é descrita por um "procedure" C ou FORTRAN, deve ter a seqüência de chamamento:

int extern2(double *AlphaR, double *AlphaI, double *Beta)

se A e E são matrizes de reais e

int extern2(double *AlphaR, double *AlphaI, double *BetaR, double *BetaI)

se A ou E é matriz de complexos. Alpha, e Beta definem o autovalor generalizado. Um valor verdadeiro ou diferente de zero siginfica autovalor generalizado selecionado.

Referências

As computações da forma de Schur matricial são baseadas nas rotinas de Lapack DGEES e ZGEES.

As computações da forma de Schur de feixes são baseadas nas rotinas de Lapack DGGES e ZGGES.

Exemplos

//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)
cd TMPDIR;
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.c',[],'c');
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.f',[],'F');
link(lp,'mytestf','f');

//run it

[As,Es,Z,dim] = schur(A,E,'mytestf')

Ver Também

Report an issue
<< rankqr Factorization sqroot >>

Copyright (c) 2022-2024 (Dassault Systèmes)
Copyright (c) 2017-2022 (ESI Group)
Copyright (c) 2011-2017 (Scilab Enterprises)
Copyright (c) 1989-2012 (INRIA)
Copyright (c) 1989-2007 (ENPC)
with contributors
Last updated:
Mon May 22 12:42:12 CEST 2023