我尝试通过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]
某些值与正确答案相反 我的代码的哪一部分是错误的? 感谢所有的答案。
答案 0 :(得分:1)
最终特征值应作为A
而不是R
的对角线元素(将return语句更改为np.diag(A)
)。此外,特征值出现在对角线上的顺序可能与其他算法不同。
您要处理实对称矩阵吗?如果不是这样,则特征值可能很复杂,不应应用QR算法。如果它具有复杂的特征值,则这些特征值成对地具有相同的大小,并且算法将不会收敛。使用过程将永远不会得到虚数。
要获得特征向量,您需要将所有Q
乘以,即$ Q1 Q2 Q3 ... $;列向量是对应的特征向量(在这里不知道如何键入乳胶)