python 简单的 QR 迭代不正确的特征值

Incorrect eigenvalue with simply QR iteration by python

我尝试通过QR迭代求解特征值和特征向量,代码超级简单。但是与 linalg.eigs.

的答案相比,QR 迭代的答案总是有一些相反或不正确的值
import numpy as np
import scipy.linalg as linalg

def qr_iteration(A):
   for i in range(100):
      Q, R = linalg.qr(A)
      A = np.dot(R, Q)
   return np.diag(R), Q

a, b = linalg.eig(A)
c, d = qr_iteration(A)
print(a)   # [ 1.61168440e+01+0.j -1.11684397e+00+0.j -1.30367773e-15+0.j]
print(c)   # [-1.61168440e+01  1.11684397e+00 -1.33381856e-15]

部分数值与正确答案相反 我的代码的哪一部分是错误的? 感谢大家的回答。

最终的特征值应该作为 A 的对角线元素找到,而不是 R(将 return 语句更改为 np.diag(A))。而且,特征值出现在对角线上的顺序可能与其他算法不同。

您处理的是实对称矩阵吗?否则,特征值可能很复杂,不应应用 QR 算法。如果它具有复杂的特征值,这些特征值成对出现且大小相同,算法将不会收敛。使用您的程序永远不会得到虚数。

要获得特征向量,您需要将所有 Q 相乘,即 $Q1 Q2 Q3...$;列向量是对应的特征向量(这里不知道怎么打latex)