除非计算的特征值的数量很大,否则Matlab的eigs不会收敛

Dim*_*i K 12 math matlab eigenvalue

我试图用以下运动方程计算阻尼结构的特征值lambda:

(lambda ^ 2*M + lambda*C + K)*x = 0.

其中M,CK是稀疏矩阵.使用Matlab的polyeig函数可以工作,但我想进入更大的系统并利用我的矩阵的稀疏性.我使用状态空间线性化来获得广义特征值问题,如下所示:

(A - lambda*B)*z = 0,

A = [ K,0 ; 0, - M ],

B = [ - C, - M ; - M,0 ],

z = [ x ; lambda*x ]

用Matlab的eigs函数解决这个问题:

lambda = eigs(A,B,10,'sm')
Run Code Online (Sandbox Code Playgroud)

产生以下输出:

lambda =
   1.0e+03 *
  -0.2518 - 1.3138i
  -0.2518 + 1.3138i
  -0.4690 - 1.7360i
  -0.4690 + 1.7360i
  -0.4690 - 1.7360i
  -0.4690 + 1.7360i
  -0.5387 - 1.8352i
  -0.5387 + 1.8352i
      NaN +    NaNi
      NaN +    NaNi
Run Code Online (Sandbox Code Playgroud)

前八个特征值是正确的,但似乎最后两个特征值不能收敛.增加Lanczos基矢量的数量似乎并没有改善这个问题.

然而,奇怪的是,增加计算的特征值(k)的数量允许越来越多的特征值收敛:

k = 10:收敛的lambda数= 8

k = 20:收敛的lambda数= 8

k = 50:收敛的lambda数= 8

k = 100:收敛的lambda数= 20

k = 120:收敛的lambda数= 80

k = 150:收敛的lambda数= 150

还值得一提的是,许多不与较低k值收敛的特征值似乎是简并的或至少非常紧密地间隔开.

我想知道是否有人能想到这种行为的解释?如果是这样,有没有办法让所有的特征值收敛而不会使k非常大?谢谢!

小智 1

这已经很老了,但仍然没有答案。如果没有实际的矩阵,很难确定。这是我最好的猜测:

eigs调用 ARPACK 例程。ARPACK 利用迭代方法 (Arnoldi) 来收敛到例如具有最小幅度的特征值(选项sm)。对于任何迭代方法,用户都可以指定诸如收敛ToleranceMaxIterations迭代过程停止之前的选项。s表示达到NaN时尚未收敛的特征值。MaxIterations

Arnoldi 方法的一个重要选项是用于近似解的 Krylov 子空间的维数。SubspaceDimension这可以通过中的选项来指定eigs。默认值为 max(2*k,20),因此增加k有效地增加了 Krylov 子空间的维度。如果您的问题需要相对较大的 Krylov 子空间来将一些特征值收敛到所需的Tolerance,这可以解释为什么增加k产量会收敛大量特征值。

为了验证我的猜测是否正确,您可以减少限制Tolerance(可能就足够了?),或者在保持不变的情况下e-6增加 的值。SubspaceDimensionk