复杂矩阵的 QR 迭代如何产生复杂的对角线条目?

计算科学 matlab 特征值 拉帕克
2021-12-25 04:58:14

在 Lapack (zhseqr) 和 matlab 中,成功计算了复杂矩阵的特征值。我注意到 QR 迭代或算法与该过程有关。重复 QR 迭代以调用上一步中 R*Q 的 QR 分解。

这是我的问题:Lapack (zgeqrf) 中的 QR 分解产生真正的对角线条目。结果,QR 迭代应该生成上三角矩阵的复对角元素。例如,

>> A = [0 2; 1 3*i];

已知此非对称 A 具有 i 和 2i 的特征值。由于特征值的大小不同,QR 迭代可能会很好地收敛而无需任何特殊偏移。所以,我们有来自 schur 分解或 Lapack 中的 QR 迭代的上三角矩阵:

>> schur(A)
ans =
       0 +          1i          -3 + 0.00066061i
       0 +          0i  1.4366e-18 +          2i

现在我尝试实现 QR 迭代,看看算法是如何工作的:

num_iter = 200;
[Q,R] = qr (A);
for ii=1:num_iter,
    [Q,R] = qr (R*Q);
end

但结果 R 有

R =
      -2 +          0i  2.4535e-13 -          3i
       0 +          0i           1 +          0i

我的代码收敛到特征值的绝对值,而不是复杂的特征值。

我的代码有什么问题?

谢谢。

1个回答

您的 QR 迭代是正确的,但您的结果不是:它不是R收敛到 的 Schur 形式A,而是R*QQR 迭代的通常公式反映了这一点:

for i=1:num_iter
    [Q,R] = qr(A);
    A = R*Q;
end

然后你得到想要的结果:

>> A

A =

   0.0000 + 2.0000i  -3.0000 - 0.0000i
  -0.0000 + 0.0000i  -0.0000 + 1.0000i