用Python进行简单QR迭代的特征值不正确

时间:2018-07-11 07:01:11

标签: python numpy scipy eigenvalue eigenvector

我尝试通过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]

某些值与正确答案相反 我的代码的哪一部分是错误的? 感谢所有的答案。

1 个答案:

答案 0 :(得分:1)

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

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

要获得特征向量,您需要将所有Q乘以,即$ Q1 Q2 Q3 ... $;列向量是对应的特征向量(在这里不知道如何键入乳胶)