Это в основном тот же ответ, что и @Drew, но объясняется немного по-другому.
Если А — матрица
1 2 0
2 1 4
0 4 1
тогда собственные значения равны лямбда = 1, 1+sqrt(20), 1-sqrt(20). Примем для простоты лямбда = 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
) в любое значение, какое захотите. Если вы установите его равным нулю и продолжите обратную замену с этим значением, вы получите нулевой вектор. Если вы установите его равным единице (или любому ненулевому значению), вы получите ненулевой вектор. Идея ответа Дрю состоит в том, чтобы заменить последнюю строку на 0 0 1 | 1
, которая устанавливает x[2]
в 1.
Ошибка округления означает, что последнее #
, которое должно быть равно нулю, вероятно, не совсем ноль, а какое-то маленькое значение, например 1e-16. На это можно не обращать внимания: просто примите его за ноль и установите x[2]
равным единице.
Обязательное предупреждение: я предполагаю, что вы реализуете это для развлечения или образовательных целей. Если вам нужно найти собственные векторы в серьезном коде, вам лучше использовать код, написанный другими, так как это сложно сделать правильно.
person
Jitse Niesen
schedule
25.10.2011