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

时间:2011-10-25 06:29:55

标签: c ansi linear-algebra

我编写了一个线性求解器,采用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}

2 个答案:

答案 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。

强制警告:我认为您是出于娱乐或教育目的而实施的。如果您需要在严格的代码中找到特征向量,那么最好使用其他人编写的代码,因为这样做很难实现。