# spec

行列とペンシルの固有値

## 呼び出し手順

    evals=spec(A)
                [R,diagevals]=spec(A)

                evals=spec(A,B)
                [alpha,beta]=spec(A,B)
                [alpha,beta,Z]=spec(A,B)
                [alpha,beta,Q,Z]=spec(A,B)

## パラメータ

A

  実数または複素正方行列

B

  `A`と同じ次元の実数または複素正方行列

evals

  実数または複素ベクトル, 固有値

diagevals

  実数または(対角項に固有値を有する)複素対角行列

alpha

  実数または複素ベクトル, al./be により固有値が得られます

beta

  実数ベクトル, al./be により固有値が得られます

R

  可逆な実数または複素正方行列, 行列右固有ベクトル.

L

  可逆な実数または複素正方行列,　ペンシル左固有ベクトル.

R

  可逆な実数または複素正方行列,　ペンシル右固有ベクトル.

## 説明

evals=spec(A)

  ベクトル`evals` に固有値を返します.

[R,diagevals] =spec(A)

  対角行列r `evals` に固有値, `R`に固有ベクトルを返します.

evals=spec(A,B)

  行列ペンシル A - s B のスペクトル,すなわち, 多項式行列 s B - Aの根,を返します.

[alpha,beta] = spec(A,B)

  行列ペンシル`A- s B`のスペクトル, すなわち,多項式行列 `A - s B`の根を返します. 一般化固有値 alpha と beta は行列 `A - alpha./beta B` が特異行列となる値です. 固有値は `al./be` により指定され, `beta(i) = 0`の場合,i番目の固有値は無限大となります. (`B = eye(A)`の場合, `alpha./beta`は `spec(A)`となります). 通常,beta=0や両方がゼロの場合に関して都合が良い解釈が存在するため, (alpha,beta)の組み合わせで表されます.

[alpha,beta,R] = spec(A,B)

  上記に加えてペンシルの一般化右固有ベクトルとなる 行列 `R`を返します.

[al,be,L,R] = spec(A,B)

  上記に加えてペンシルの一般化右および左固有ベクトルである行列 `L` および`R`を返します.

[al,be,Z] = spec(A,E)

  一般化右固有ベクトルである行列 `Z` を返します.

[al,be,Q,Z] = spec(A,E)

  一般化右および左固有ベクトルである行列 `Q` および `Z`を返します.

大きな完全 / 疎行列の場合, Arnoldi モジュールを使用することができます.

## 参照

行列の固有値計算は Lapack ルーチンに基づいています

- 行列が対称でない場合, DGEEV および ZGEEV.

- 行列が対称の場合, DSYEV および ZHEEV.

複素対象行列は複素共役の非対角項と実数の対角項を有します.

ペンシル固有値計算は Lapack ルーチン DGGEV および ZGGEVに基づいています.

## 実数および複素行列

例えば evals や R のような出力変数の型は入力行列 A および B の型と 同じである必要はないことに注意してください. 以下のパラグラフでは、行列 A の固有値および固有ベクトルを 計算する際の出力変数の型を解析します.

- 実数 A 行列

  - 対称

    固有値と固有ベクトルは実数.

  - 非対称

    固有値と固有ベクトルは複素数.

- 複素 A 行列

  - 対称

    固有値は実数だが固有ベクトルは複素数.

  - 非対称

    固有値,固有ベクトルは複素数.

## 例

    // MATRIX EIGENVALUES
    A=diag([1,2,3]);
    X=rand(3,3);
    A=inv(X)*A*X;
    spec(A)

    x=poly(0,'x');
    pol=det(x*eye()-A)
    roots(pol)

    [S,X]=bdiag(A);
    clean(inv(X)*A*X)

    // PENCIL EIGENVALUES
    A=rand(3,3);
    [al,be,R] = spec(A,eye(A));
    al./be
    clean(inv(R)*A*R)  //displaying the eigenvalues (generic matrix)
    A=A+%i*rand(A);
    E=rand(A);
    roots(det(A-%s*E))   //complex case

## 参照

- poly
- det
- schur
- bdiag
- colcomp
- dsaupd
- dnaupd