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

时间:2017-05-18 19:48:40

标签: matlab eigenvalue

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

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

其中 M C K 是稀疏矩阵。使用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')

产生以下输出:

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

前八个特征值是正确的,但似乎最后两个特征值无法收敛。增加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 个答案:

答案 0 :(得分:1)

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

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

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

要验证我的猜测是否正确,您可以使用限制较少的 Tolerancee-6 可能就足够了?)或在保持 SubspaceDimension 的同时增加 k 的值常数。