我正在尝试解决大矩阵(8000×8000)的特征值问题。由于A
和B
在我的案例中很少,我认为使用eigs
比eig
更好。但问题是B
是单数的,MATLAB的eigs
无法处理它。
是否有解决此问题的解决方法?
P.S:
A
和B
都是复杂且非对称的
答案 0 :(得分:7)
MATLAB利用的基础ARPACK例程允许解决奇异质量矩阵问题(B
到MATLAB,M
到ARPACK)。 APRACK文档说明:
如果 M 是单数或者如果一个人对点σ附近的特征值感兴趣,那么用户可以选择使用 C =( A - σ M ) -1 M
其中 C 是移位的运算符。因此,通过明确指定移位参数sigma
的数值,eigs
可以尝试收敛到最接近的支配特征值,只要移位不会使 C 奇异
例如,
>> 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
会引发错误:
>> eigs(A,B,1)
Error using eigs/checkInputs/LUfactorB (line 954)
B is singular.
...
指定班次补救此 1
>> eigs(A,B,1,0)
ans =
0.1277
但这只是在0
附近发现的主导特征值。我们来看看其他一些观点
>> 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
如果看起来像4.1307 + 0.2335i
可能是系统的主要特征值。让我们围绕这一点来寻找更多的特征值:
>> 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
...
首先,我们看到恼人的无限特征值给出了所有问题。
其次,我们可以看到eigs
确实找到了最大的有限特征值,但是没有找到复杂平面中稍小的幅度特征值,因为纯实数特征值更接近移位点:
>> [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)
是的,有一种解决方法。但它需要更多的工作来稳健而正确地执行,这是涉及奇异矩阵的问题的norm
。
我想说,“最好的方法”是,如果问题适合记忆并且可以在合理的时间内直接计算,那么就这样做。否则,上述转换方法可以省力补充工作。
1 我会注意到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 矩阵,这是不好的。略微偏离这一点可以弥补错误。