我试图用下列运动方程计算阻尼结构的特征值λ(λ):
(M+λC + K) x =E 210,
其中M、C和K是稀疏矩阵。使用MATLAB的polyeig函数工作,但我想去更大的系统,并利用我的矩阵稀疏性。利用状态空间线性化得到了广义特征值问题如下:
(A -λB) z = ,
使用
A = K,;,-ME 235,
B = -C,-M;-M,e 245,
z = x;λ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:收敛的lambdas数=8k = 20:收敛的lambdas数=8k = 50:收敛的lambdas数=8k = 100:收敛的lambdas数= 20k = 120:收敛的λ数= 80k = 150:收敛的λ数= 150还值得一提的是,许多不收敛于较低的k值的特征值似乎是退化的,或者至少是非常接近的距离。
我想知道是否有人能为这种行为想出一个解释?如果是这样的话,有没有办法使所有的特征值在不使k非常大的情况下收敛?谢谢!
发布于 2021-02-02 13:52:18
这是旧的,但仍然没有答案。没有实际的矩阵,就很难确定。这是我最好的猜测:
eigs调用ARPACK例程。ARPACK利用迭代方法(Arnoldi)收敛于最小幅值的特征值(选项sm)。对于任何迭代方法,用户可以在迭代过程停止之前指定像收敛Tolerance和MaxIterations这样的选项。NaNs表示到达MaxIterations时尚未收敛的特征值。
Arnoldi方法的一个重要选择是用于逼近解的Krylov子空间的维数。这可以由SubspaceDimension选项在eigs中指定。默认值是max(2*k,20),因此增加k有效地增加了Krylov子空间的维数。如果您的问题需要一个相对较大的Krylov子空间来将某些特征值收敛到所需的Tolerance,这可以解释为什么增加k会产生更多特征值的收敛。
要验证我的猜测是否正确,要么使用限制较少的Tolerance (e-6可能就足够了?)或增加SubspaceDimension的值,同时保持k不变。
https://stackoverflow.com/questions/44056620
复制相似问题