Dim*_*i K 12 math 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')
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)。对于任何迭代方法,用户都可以指定诸如收敛Tolerance和MaxIterations迭代过程停止之前的选项。s表示达到NaN时尚未收敛的特征值。MaxIterations
Arnoldi 方法的一个重要选项是用于近似解的 Krylov 子空间的维数。SubspaceDimension这可以通过中的选项来指定eigs。默认值为 max(2*k,20),因此增加k有效地增加了 Krylov 子空间的维度。如果您的问题需要相对较大的 Krylov 子空间来将一些特征值收敛到所需的Tolerance,这可以解释为什么增加k产量会收敛大量特征值。
为了验证我的猜测是否正确,您可以减少限制Tolerance(可能就足够了?),或者在保持不变的情况下e-6增加 的值。SubspaceDimensionk