# 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 de`A`.

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

- spec
- bdiag
- ricc
- pbig
- psmall