我已经用ANSI C编写了一个使用Householder反射/变换的线性求解器,它在给定A和b的情况下求解Ax=B。我想用它来找到与特征值相关的特征向量,如下所示:
(A-lambda*I)x = 0
问题是,0向量总是我得到的解(在有人说之前,是的,我有100%确定的正确特征值)。
这里有一个非常准确地说明这个问题的例子:
给定A-lambda*I
(示例恰好是Hermitian):
户主的反思/转换将产生类似这样的结果
# # # | 0
0 # # | 0
0 0 # | 0
回代会发现解是{0,0,0}
。
2条答案
按热度按时间lzfw57am1#
我已经有一段时间没有写特征值求解器了,但我似乎记得诀窍是将它从
(A - lambda*I) * x = 0
重构为A*x = lambda*x
。然后你的Householder或Givens步骤将给你这样的结果:...从中你可以回代,而不会到达退化的0向量。通常你也希望以规范化的形式提供x。
我的记忆力很差,所以我建议检查Golub & Van Loan以获得明确的答案。要使其健壮地工作,特别是对于非对称情况,需要很多技巧。
wnrlj8wa2#
这和@Drew的答案基本相同,但解释有点不同。
如果A是矩阵
则特征值为lambda = 1,1+sqrt(20),1-sqrt(20)。为简单起见,我们取lambda = 1。则系统
(A - lambda*I) * x = 0
的增广矩阵为现在你做Householder / Givens把它简化为上三角形,就像你说的,你得到了一些形式
然而,最后一个
#
应该是零(或几乎为零)。现在进行回代。在第一步中,求解最后一行中的方程。但是,该方程不会产生任何信息,因此可以设置
x[2]
(向量x
的最后一个元素)设置为任意值。如果将其设置为零并继续使用该值进行反向替换,则会得到零向量。如果将其设置为1Drew的答案背后的想法是将最后一行替换为0 0 1 | 1
,这将x[2]
设置为1。舍入误差意味着最后一个
#
,应该是零,可能不是零,而是像1 e-16这样的小值。这可以忽略:只要把它当作零,把x[2]
设为1。强制性警告:我假设你是出于娱乐或教育的目的来实现这一点的。如果你需要在严肃的代码中找到特征向量,你最好使用别人写的代码,因为这东西很难做对。