MATLAB - 当B是单数时,Eigs(A,B)

时间:2017-01-06 09:49:52

标签: matlab

我正在尝试解决大矩阵(8000×8000)的特征值问题。由于AB在我的案例中很少,我认为使用eigseig更好。但问题是B是单数的,MATLAB的eigs无法处理它。

是否有解决此问题的解决方法?

P.S: AB都是复杂且非对称的

1 个答案:

答案 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 矩阵,这是不好的。略微偏离这一点可以弥补错误。