実際の行列に適用されたQRアルゴリズムはどのようにして複素固有値を返しますか?


8

私は固有値アルゴリズムの初心者ですが、何か注意が必要です。QRアルゴリズムは、実数/複素数の固有値を生成する実数/複素数行列で機能します。ただし、実際の行列から複素固有値を生成することはできません。ここでは、ジュリアで書かれ、ここここから派生した単純な例を示します

using LinearAlgebra
A = [7 3 4 11 -9 -2;
    -6 4 -5 7 1 12;
    -1 -9 2 2 9 1;
    -8 0 -1 5 0 8;
    -4 3 -5 7 2 10;
    6 1 4 -11 -7 -1]
M = copy(A)

for i=1:100
    global M
    Q,R = LinearAlgebra.qr(M);
    M=R*Q;
end

display(diag(M))
display(eigvals(A))

6-element Array{Float64,1}:
 -2.8415406888480472
  8.675063708533656
  3.658872985794657
  6.3411270142053695
  0.12201942568224483
  3.0444575546321087
6-element Array{Complex{Float64},1}:
  2.916761509842819 + 13.248032079355992im
  2.916761509842819 - 13.248032079355992im
  5.000000000000005 + 6.000000000000003im
  5.000000000000005 - 6.000000000000003im
 1.5832384901571723 + 1.4155521348117128im
 1.5832384901571723 - 1.4155521348117128im

行列Aを実数成分のみの複素数として定義しても、違いはありません。

私の質問は:

  • 主題に関する私の概念的な誤解は何ですか?
  • どのステップが間違っていますか?
  • そしてそれを修正する方法?

ありがとうございました


2
あなたは、インスタンスのチェックのために、キリスト教のClasonの解答できるについては最低というブロックは、トレースがある 0.12201942568224483 + 3.0444575546321087 = 3.1664769803143535も最後の固有値のペアの約2倍の実部である2 * 1.5832384901571723 = 3.1664769803143447を。同じ関係が他の2つのペアにも当てはまるはずですが、次のペアの順序関係は最後のペアほど保証されません。これは、シフトやその他のベルなしのシンプルなQRアルゴリズムでは常に最小の固有値です。2×20.12201942568224483+3.0444575546321087=3.166476980314353521.5832384901571723=3.1664769803143447
Lutz Lehmann

3
実数行列には複素固有値が含まれる場合があります。実数行列と対称行列は、実数固有値のみを持つことができます。math.stackexchange.com/questions/67304/…–
R zu

回答:


13

簡単に言うと、行列適用されるQRアルゴリズムは、実際のシュール分解に収束する反復手順です。A = Q R Q Tとなるような、ブロック上三角形式のユニタリ行列Qと行列R(以下を参照)。したがって、Qの列は固有ベクトル(計算される主要なオブジェクトです)であり、RAと同じ固有値を持ちます。=QRQTQR

重要な点は、ブロックの上三角の形です。つまり、

R=R110Rメートルメートル
ここでRはいずれかのブロック

  • サイズ1×1。この場合、R(実)固有値、または
  • サイズ2×2。この場合、R複素共役固有値のペア(2+2)があります。

2×2Reigvals

×=0110±R2×2 ブロック(たとえば、対角要素が許容値より大きいかどうかをチェックすることにより)、そうである場合は、数式によって固有値を計算します。

eigenvalues2×2

using LinearAlgebra
A = [7 3 4 11 -9 -2;
    -6 4 -5 7 1 12;
    -1 -9 2 2 9 1;
    -8 0 -1 5 0 8;
    -4 3 -5 7 2 10;
    6 1 4 -11 -7 -1]
M = copy(A)

for i=1:100
    global M
    Q,R = LinearAlgebra.qr(M);
    M=R*Q;
end

eig = Complex{Float64}[]
let
    i=1
    N=size(M,1)
    while i<N   
        if abs(M[i+1,i])<1e-10             
            append!(eig,M[i,i])         
            i+=1         
        else             
            append!(eig,eigvals(M[i:i+1,i:i+1]))         
            i+=2         
        end                 
    end
    if length(eig)<N
       append!(eig,M[N:N,N:N])
    end                 
end       

私はあなたの意見を理解しているとは思わない。私の例では、固有値を含む行列Mです。それから複素固有値を取得するにはどうすればよいですか?(もし誰かがソースコードを提供できればもっと良いでしょう)
Noel Araujo '23

2
R

2
このアプローチの利点の1つは、2x2ブロックの固有値を見つけるための合理的な方法により、理論上必要に応じて複素固有値が複素共役ペアになることです。
ブライアンボーチャーズ2018年

3
@NoelAraujo M対角線だけでなく、行列全体を見る必要がありますdiag(M)M対角線でも三角形でもないため)。次に、2x2ブロックが表示されます。たとえば、で私の主張を確認できeigvals(M[1:2,1:2])ます。(@BrianBorchersそれはきちんとしたトリックです!)
クリスチャンクラソン2018年

2
@KutalmisB(実際の固有基底ではなく)複雑な固有ベクトルが必要な場合、最も簡単な方法は、おそらく最初から複雑な算術演算を行うブライアンのアプローチです。実際のSchur分解から複雑な固有ベクトルを抽出することはできますが、トリッキーです。LAPACKがどのように実行するかを確認できます。
クリスチャンクラソン

5

QRアルゴリズムを忘れて、固有値が何であるかを覚えてください-それらは行列の特性多項式の根です(例:https : //en.wikipedia.org/wiki/Characteristic_polynomialを参照)。次数Nの実数行列の場合、これは実数係数をもつ次数Nの多項式です。しかし、実際の係数は必ずしも実際の根を意味するわけではなく、複雑な共役ペアがある場合があります。したがって、一般的な実数行列は複素固有値を持つ場合があります。


0

この方程式を何度も使用して、収束をテストしました。最初の行の11は-11です。マトリックスと同様に、シフトなしでQRアルゴリズムを実行すると、約60回の反復で、複雑なものであっても固有値がほぼ正確に対角線上に表示されるマトリックスになります。5 + -6iは最初の2行にあり、4と3は次の2行にあり、最後に1 + -21が右下のブロックにあります。2x2行列の固有値を計算せずに、通常、複雑な値がこのようにはっきりと表示されるとは考えないでください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.