三次特征值问题的 Jacobi-Davidson 方法的实现

计算科学 C++ 本征系统 特征值
2021-12-12 08:22:48

我有一个很大的三次特征值问题:

(A0+λA1+λ2A2+λ3A3)x=0.

我可以通过转换为线性特征值问题来解决这个问题,但这会导致系统32一样大:

[A0000I000I][xyz]=λ[A1A2A3I000I0][xyz],

在哪里y=λxz=λy. 还有哪些其他技术可用于解决三次特征值问题?我听说有一个版本的 Jacobi-Davidson 可以解决它,但还没有找到实现。

此外,我需要能够以类似于 ARPACK 的移位和反转方法的方式定位特定特征值并找到相关的特征向量。

1个回答

使用 ARPACK 的反向通信协议,您不需要存储3n×3n显式矩阵:您只需要提供两个计算函数:

[xyz][A0xyz][xyz][A1x+A2y+A3zyz]

(你还是要付出存储的代价3×n维向量,但您无需为矩阵支付任何费用)。

关于逆变换,您也可以这样做,即通过使用计算的回调自己实现它xM1x代替xMx并替换计算的λsλ1. 计算M1x,你可以预先考虑你的矩阵M,这意味着只有预分解A0(根据矩阵的结构使用 LU、Cholesky 或它们的稀疏版本)。对于完整的移位逆变换,我认为可以做类似的事情。