我试图用以下运动方程计算阻尼结构的特征值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非常大?谢谢!
答案 0 :(得分:1)
这是旧的,但仍然没有答案。如果没有实际的矩阵,就很难确定。这是我最好的猜测:
eigs
调用 ARPACK 例程。 ARPACK 利用迭代方法 (Arnoldi) 收敛到例如具有最小幅度的特征值(选项 sm
)。对于任何迭代方法,用户可以在迭代过程停止之前指定收敛Tolerance
和MaxIterations
等选项。 NaN
表示达到 MaxIterations
时尚未收敛的特征值。
Arnoldi 方法的一个重要选项是用于逼近解的 Krylov 子空间的维度。这可以通过 SubspaceDimension
中的选项 eigs
指定。默认值为 max(2*k,20),因此增加 k
有效地增加了 Krylov 子空间的维度。如果您的问题需要相对较大的 Krylov 子空间来将某些特征值收敛到所需的 Tolerance
,这可以解释为什么增加 k
会产生大量特征值的收敛。
要验证我的猜测是否正确,您可以使用限制较少的 Tolerance
(e-6
可能就足够了?)或在保持 SubspaceDimension
的同时增加 k
的值常数。