复杂但非双矩阵的LAPACK非收敛特征值算法

计算科学 线性代数 特征值 拉帕克
2021-12-11 21:05:34

我在用 Matlab 格式求解以下矩阵的特征值时遇到了一个奇怪的问题:

[ 0 1 0 1 0 0 0 0 0 0 0 0 1 1;
  1 0 0 0 0 0 0 0 0 0 0 0 0 0;
  0 1 0 1 0 0 0 0 0 0 0 0 0 0;
  0 0 1 0 0 0 0 0 0 0 0 0 0 0;
  0 0 0 0 0 1 0 0 0 0 0 0 0 0;
  0 0 0 0 1 0 0 0 0 0 0 0 0 0;
  0 0 0 0 0 0 0 1 0 0 0 0 0 0;
  0 0 0 0 0 0 1 0 0 0 0 0 0 0;
  0 0 0 0 0 0 0 0 0 1 0 0 0 0;
  0 0 0 0 0 0 0 0 1 0 0 1 0 0;
  0 0 0 0 0 0 0 0 1 0 0 1 0 0;
  0 0 0 0 0 0 0 0 0 0 1 0 0 0;
  0 1 0 0 0 0 0 0 0 0 0 0 1 1;
  0 1 0 0 0 0 0 0 0 0 0 0 1 1 ]

当存储为双精度矩阵时,在该矩阵上调用 dgeev 可以正确找到特征值。

但是,当存储为复数双精度矩阵(所有虚部都设置为)时,对其调用 zgeev 会返回错误值,表明 QR 算法无法收敛。013

奇怪的是,将这个矩阵乘以(因此实部为)会导致再次找到正确的特征值。i0

是什么导致 QR 算法在第一个复杂情况下不收敛,有没有办法绕过它?

1个回答

您的矩阵不可对角化,在它的 Jordan 分解中,有一个特征值的块,形式为 这意味着只有两个特征向量的三重零特征值. 如果您以数值方式计算特征向量矩阵,它的条件数为(实际值为),它会立即告诉您有问题,因为确定特征值对原始矩阵中的扰动的敏感性。0

(000001000),
κ(X)1016κ(X)=κ(X)

Lapack 算法可能假设矩阵是可对角化的,在这种情况下,它们给出错误是明智的。它是否给出错误可能取决于舍入错误的影响,并且与乘以没有太大关系,我不会对此进行太多解读。i