我编写了一个线性求解器,采用ANSI C中的Householder反射/变换,解决了给定A和b的Ax = b。我想用它来找到与特征值相关的特征向量,如下所示:
(A-lambda*I)x = 0
问题是0向量总是我得到的解决方案(在有人说出之前,是的,我有100%确定性的正确特征值)。
以下是一个非常准确地说明问题的示例:
鉴于A-lambda*I
(例如恰好是Hermitian):
1 2 0 | 0
2 1 4 | 0
0 4 1 | 0
Householder反思/转换将产生类似这样的东西
# # # | 0
0 # # | 0
0 0 # | 0
后面替换会发现解决方案显然是{0,0,0}
。
答案 0 :(得分:4)
自从我写了一个eigensolver以来已经有一段时间了,但我似乎记得诀窍是将它从(A - lambda*I) * x = 0
重构为A*x = lambda*x
。然后你的Householder或Givens步骤会给你一些类似的东西:
# # # | #
0 # # | #
0 0 1 | 1
...从中可以在不到达退化0向量的情况下进行替换。通常,您也希望以标准化形式提供x。
我的记忆非常生疏,所以我建议您查看Golub & Van Loan以获得明确答案。有一些技巧可以使这种方法有效地运作,特别是对于非对称情况。
答案 1 :(得分:1)
这与@Drew基本上是一样的答案,但解释有点不同。
如果A是矩阵
1 2 0
2 1 4
0 4 1
那么特征值是lambda = 1,1 + sqrt(20),1-sqrt(20)。让我们简单地看一下lambda = 1.然后系统(A - lambda*I) * x = 0
的增广矩阵是
0 2 0 | 0
2 0 4 | 0
0 4 0 | 0
现在你做Householder / Givens将它减少到上三角形。正如你所说,你会得到一些形式
# # # | 0
0 # # | 0
0 0 # | 0
但是,最后#
应为零(或几乎为零)。你得到的确切取决于你所做的转变的细节,但如果我手工完成,我会得到
2 0 4 | 0
0 2 0 | 0
0 0 0 | 0
现在你做后退。在第一步中,您将解决最后一行中的等式。但是,此等式不会产生任何信息,因此您可以将x[2]
(向量x
的最后一个元素)设置为您想要的任何值。如果将其设置为零并继续使用该值进行反向替换,则会得到零向量。如果将其设置为一(或任何非零值),则会得到非零向量。 Drew的答案背后的想法是用0 0 1 | 1
替换最后一行,将x[2]
设置为1。
舍入误差意味着最后#
(应该为零)可能不是很零,而是一些小值,如1e-16。这可以忽略:只需将其设为零并将x[2]
设置为1。
强制警告:我认为您是出于娱乐或教育目的而实施的。如果您需要在严格的代码中找到特征向量,那么最好使用其他人编写的代码,因为这样做很难实现。