首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >除非计算出的特征值数目很大,否则Matlab的特征值不收敛

除非计算出的特征值数目很大,否则Matlab的特征值不收敛
EN

Stack Overflow用户
提问于 2017-05-18 19:48:40
回答 1查看 2K关注 0票数 17

我试图用下列运动方程计算阻尼结构的特征值λ(λ):

(MC + 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函数解决这个问题:

代码语言:javascript
复制
lambda = eigs(A,B,10,'sm')

产生以下输出:

代码语言:javascript
复制
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数=8
  • k = 20:收敛的lambdas数=8
  • k = 50:收敛的lambdas数=8
  • k = 100:收敛的lambdas数= 20
  • k = 120:收敛的λ数= 80
  • k = 150:收敛的λ数= 150

还值得一提的是,许多不收敛于较低的k值的特征值似乎是退化的,或者至少是非常接近的距离。

我想知道是否有人能为这种行为想出一个解释?如果是这样的话,有没有办法使所有的特征值在不使k非常大的情况下收敛?谢谢!

EN

回答 1

Stack Overflow用户

发布于 2021-02-02 13:52:18

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

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

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

要验证我的猜测是否正确,要么使用限制较少的Tolerance (e-6可能就足够了?)或增加SubspaceDimension的值,同时保持k不变。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44056620

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档