。 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行列を作成します。この点を少し動かして、エラーを是正します。
eigはそれを解決しますか? (小規模のテストケースの場合) –
@AlexanderKemp:そうです。 'eig'は特異行列を扱うことができます – Rhinocerotidae
@AlexanderKempの問題は、' eig'は実対称行列のみを扱うことです。 –