11

この例のような行列があります (実際の行列はもっと大きくなる可能性があります)

A = [-1 -2   -0.5;
      0  0.5  0;
      0  0   -1];

線形独立固有値が 2 つしかない (固有値 -1 が繰り返される)。一般化された固有ベクトルを使用して完全な基底を取得したいと考えています。これを行う方法の 1 つjordanは、Symbolic Math ツールボックスの Matlab の関数を使用することですが、数値入力用に設計されたものを好みます (実際、2 つの出力があるjordan場合、大きな行列では失敗します:「MuPAD コマンドのエラー: 類似度行列が大きすぎます)」 .")。ジョルダンの正準形式は必要ありません。これは、数値コンテキストでは不安定であることで有名であり、一般化された固有ベクトルの行列だけです。これを数値的に安定した方法で自動化する関数または関数の組み合わせはありますか、または一般的な手動の方法を使用する必要がありますか (そのような手順はどれほど安定していますか)?

: 「一般化された固有ベクトル」とは、いわゆる欠陥行列の不完全な基底を補強するために使用できるゼロ以外のベクトルを意味します。orを使用して一般化固有値問題を解くことで得られる固有値に対応する固有ベクトルを意味するわけではありません(この後者の使用法は非常に一般的ですが、避けるのが最善だと思います)。誰かが私を正してくれなければ、この 2 つが同じだとは思えません。eigqz


更新 1 – 5 か月後:

82 行 82 列より大きい行列の一般化された固有ベクトルを記号的に取得する方法については、こちらの回答を参照してください (この質問のテスト行列の制限)。

私はまだ数値スキームに興味があります (または、それらがすべてヨルダン形式の計算に関連している場合、そのようなスキームがどのように不安定になる可能性があるか)。この質問の複製としてマークされている線形代数101メソッドをやみくもに実装したくはありません。これは数値アルゴリズムではなく、学生を評価するために使用される鉛筆と紙の方法です(実装できると思いますただし、象徴的に)。誰かがそのスキームの実装またはその数値解析のいずれかを教えてくれるなら、私はそれに興味があります.

更新 2 – 2015 年 2 月: R2014b でテストされているように、上記のすべてが依然として当てはまります。

4

1 に答える 1

1

私のコメントで述べたように、マトリックスに欠陥があるが、許容範囲を考慮して同一と見なしたい固有ベクトル/固有値のペアがわかっている場合は、以下の例のように進めることができます。

% example matrix A:
A = [1 0 0 0 0; 
     3 1 0 0 0; 
     6 3 2 0 0; 
     10 6 3 2 0;
     15 10 6 3 2]
% Produce eigenvalues and eigenvectors (not generalized ones)
[vecs,vals] = eig(A)

これにより、次のように出力されます。

vecs =

     0         0         0         0    0.0000
     0         0         0    0.2236   -0.2236
     0         0    0.0000   -0.6708    0.6708
     0    0.0000   -0.0000    0.6708   -0.6708
1.0000   -1.0000    1.0000   -0.2236    0.2236


vals =

 2     0     0     0     0
 0     2     0     0     0
 0     0     2     0     0
 0     0     0     1     0
 0     0     0     0     1

最初の 3 つの固有ベクトルは、最後の 2 つの固有ベクトルと同様に、作業精度とほぼ同じであることがわかります。ここでは、問題の構造を理解し、同一の固有値の同一の固有ベクトルを特定する必要があります。ここで、固有値はまったく同じなので、どれを考慮すべきかがわかります。対応するベクトル 1-2-3 は同一であり、ベクトル 4-5 は同一であると仮定します。(実際には、固有ベクトルの差のノルムを確認し、それを許容範囲と比較します)

\次に、一般化された固有ベクトルの計算に進みますが、 は明らかに(A - lambda*I)フル ランクではないため、単純に matlab の で解くには悪条件です。したがって、疑似逆数を使用します。

genvec21 = pinv(A - vals(1,1)*eye(size(A)))*vecs(:,1);
genvec22 = pinv(A - vals(1,1)*eye(size(A)))*genvec21;
genvec1 = pinv(A - vals(4,4)*eye(size(A)))*vecs(:,4);

与えるべきもの:

genvec21 =

   -0.0000
    0.0000
   -0.0000
    0.3333
         0

genvec22 =

    0.0000
   -0.0000
    0.1111
   -0.2222
         0

genvec1 =

    0.0745
   -0.8832
    1.5317
    0.6298
   -3.5889

これは、他の一般化された固有ベクトルです。これらをチェックして、次のようにヨルダンの標準形を取得するとします。

jordanJ = [vecs(:,1) genvec21 genvec22 vecs(:,4) genvec1];
jordanJ^-1*A*jordanJ

私達は手に入れました:

ans =

2.0000    1.0000    0.0000   -0.0000   -0.0000
     0    2.0000    1.0000   -0.0000   -0.0000
     0    0.0000    2.0000    0.0000   -0.0000
     0    0.0000    0.0000    1.0000    1.0000
     0    0.0000    0.0000   -0.0000    1.0000

これは、Jordan の正規形です (作業精度エラーあり)。

于 2015-02-16T09:47:04.410 に答える