2017-01-06 25 views
2

大きな行列(8000×8000)の固有値問題を解こうとしています。私の場合はABがまばらですから、をeigよりも使用する方が良いと思いました。しかし、問題はBが特異であり、MATLABのeigsがそれを処理できないということです。MATLAB - Bが特異であるときのEigs(A、B)

この問題を解決するための回避策はありますか?

P.S: AB両方はMATLABで利用下地ARPACKルーチンが(MATLAB、ARPACKにMからB)特異質量行列の問題の解決を可能に複雑であり、非対称

+0

eigはそれを解決しますか? (小規模のテストケースの場合) –

+0

@AlexanderKemp:そうです。 'eig'は特異行列を扱うことができます – Rhinocerotidae

+1

@AlexanderKempの問題は、' eig'は実対称行列のみを扱うことです。 –

答えて

5

。 APRACKドキュメントの状態:Cがシフト演算子である

If M is singular or if one is interested in eigenvalues near a point σ then a user may choose to work with C = (A - σ M)-1M

。したがって、シフトパラメータsigmaの数値を明示的に指定することによって、Cを単項式にしない限り、eigsは最も近い支配的な固有値に収束しようとすることができます。

例えば、

>> n = 1000; 
>> A = sprandn(n,n,1/n) + speye(n,n); % ensure invertibility of A 
>> B = sprandn(n,n,1/n); B(1:n-1,1:n-1) = B(1:n-1,1:n-1) + speye(n-1); % mildly pathological B 
>> condest(B) 
ans = 
    Inf 

Aは可逆である必要はありませんが、それは私たちが少しで私たちの答えをチェックできるようになります。シフト救済この

>> eigs(A,B,1,0) 
ans = 
    0.1277 

を指定

>> eigs(A,B,1) 
Error using eigs/checkInputs/LUfactorB (line 954) 
B is singular. 
... 

しかし、それは0近くで見つけた唯一の支配固有値です:指定されたシフトせずにeigsを呼び出すと、エラーがスローされます。 4.1307 + 0.2335iのように見えますが、システムの支配固有値であるかもしれない場合のいくつかの他のポイント

>> sort(arrayfun(@(sigma)eigs(A,B,1,sigma),linspace(-10,10,10).'),'descend') 
ans = 
    4.1307 + 0.2335i 
    4.1307 + 0.2335i 
    4.1307 + 0.2335i 
    3.3349 + 0.0000i 
    1.1267 + 0.0000i 
    0.1277 + 0.0000i 
    0.1277 + 0.0000i 
    0.1277 + 0.0000i 
    0.1277 + 0.0000i 
    0.1277 + 0.0000i 

を確認してみましょう。より多くの固有値のためにその点を見てみましょう:

>> eigs(A,B,5,4.13) 
ans = 
    4.1307 - 0.2335i 
    4.1307 + 0.2335i 
    3.3349 + 0.0000i 
    2.8805 + 0.0000i 
    2.6613 + 0.0000i 

いいね。しかし、より大きな有限の固有値が存在しますか? Aが可逆であるので、幸いにも、我々は直接eig(B/A)の逆数を取ることによって固有値を確認することができます。

>> lam = sort(1./eig(full(B/A)),'descend') 
lam = 
     Inf + 0.0000i 
    4.1307 + 0.2335i 
    4.1307 - 0.2335i 
    3.4829 + 1.6481i 
    3.4829 - 1.6481i 
    3.3349 + 0.0000i 
    2.4162 + 2.1442i 
    2.4162 - 2.1442i 
    2.8805 + 0.0000i 
    2.2371 + 1.7137i 
    2.2371 - 1.7137i 
    ... 

まず、我々は迷惑な無限の固有値はすべての問題を与えていることがわかります。だから、

>> [lam,abs(lam-4.13)] 
ans = 
     Inf + 0.0000i  Inf + 0.0000i 
    4.1307 + 0.2335i 0.2335 + 0.0000i % found by eigs(A,B,5,4.13) 
    4.1307 - 0.2335i 0.2335 + 0.0000i % found by eigs(A,B,5,4.13) 
    3.4829 + 1.6481i 1.7705 + 0.0000i 
    3.4829 - 1.6481i 1.7705 + 0.0000i 
    3.3349 + 0.0000i 0.7951 + 0.0000i % found by eigs(A,B,5,4.13) 
    2.4162 + 2.1442i 2.7450 + 0.0000i 
    2.4162 - 2.1442i 2.7450 + 0.0000i 
    2.8805 + 0.0000i 1.2495 + 0.0000i % found by eigs(A,B,5,4.13) 
    (8 more complex eigenvalues) 
    2.6613 + 0.0000i 1.4687 + 0.0000i % found by eigs(A,B,5,4.13) 

: 第二に、私たちは純粋に本当の固有値は、変速点に近かったのでeigsは複素平面でわずかに小さい大きさの固有値を最大有限固有値を見つけることでしたが、見つからなかったことがわかりますはい、回避策があります。しかし、これは、頑強で正確に実行するためにはより多くの作業を必要とします。これは特異行列に関する問題の場合はnormです。

「最良の方法」は、問題がメモリに合っていて、妥当な時間内に直接計算できる場合は、そうすることです。さもなければ、上記のシフト方法は作業を補うことができる。


私はsigmaのないすべての値が動作することに注意しましょう。 1が失敗し、上記の例:

>> eigs(A,B,5,1) 
Error using eigs/checkInputs/LUfactorAminusSigmaB (line 994) 
The shifted operator is singular. The shift is an eigenvalue. 
Try to use some other shift please. 

は、例示的なシステムにおける1固有値の数が多いために行う、選択されたシフトは良くない特異C行列を作成します。この点を少し動かして、エラーを是正します。

関連する問題