ANSI C +数值线性代数-使用线性求解器找到给定特征值的特征向量(问题)

qhhrdooz  于 2023-03-22  发布在  其他
关注(0)|答案(2)|浏览(134)

我已经用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}

lzfw57am

lzfw57am1#

我已经有一段时间没有写特征值求解器了,但我似乎记得诀窍是将它从(A - lambda*I) * x = 0重构为A*x = lambda*x。然后你的Householder或Givens步骤将给你这样的结果:

# # # | #
0 # # | #
0 0 1 | 1

...从中你可以回代,而不会到达退化的0向量。通常你也希望以规范化的形式提供x。
我的记忆力很差,所以我建议检查Golub & Van Loan以获得明确的答案。要使其健壮地工作,特别是对于非对称情况,需要很多技巧。

wnrlj8wa

wnrlj8wa2#

这和@Drew的答案基本相同,但解释有点不同。
如果A是矩阵
则特征值为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的最后一个元素)设置为任意值。如果将其设置为零并继续使用该值进行反向替换,则会得到零向量。如果将其设置为1Drew的答案背后的想法是将最后一行替换为0 0 1 | 1,这将x[2]设置为1。
舍入误差意味着最后一个#,应该是零,可能不是零,而是像1 e-16这样的小值。这可以忽略:只要把它当作零,把x[2]设为1。
强制性警告:我假设你是出于娱乐或教育的目的来实现这一点的。如果你需要在严肃的代码中找到特征向量,你最好使用别人写的代码,因为这东西很难做对。

相关问题