Если у вас есть надежное предположение о том, насколько велико искомое значение, например lambda_guess, вы можете использовать Power итерацию на
(A - lambda_guess* Id)^-1
Этот подход иногда называютв качестве метода обратного сдвига.Здесь метод будет сходиться к собственному значению, ближайшему к lambda_guess (и чем лучше вы угадываете, тем быстрее сходимость).Обратите внимание, что вы не будете хранить обратное, а только вычисляете решение
x_next_iter = solve(A - lambda_guess*Id, x_iter)
, возможно, само с помощью итеративного линейного решателя.
Я бы совместил это с методом итерации подпространства сподпространство, по крайней мере, размер два.Таким образом, на первой итерации вы можете найти наименьшее и второе наименьшее собственные значения lambda1, lambda2
.
Тогда вы можете попробовать lambdaguess= lambda2+ epsilon
, чтобы первый и второй выведенные собственные векторы соответствовали второму и третьему наименьшим собственным значениям соответственно (если первое собственное значение этой итерации не совпадает со значением lambda2 дляВ предыдущей итерации необходимо уменьшить и повторить эпсилон. На практике вы должны проверить, достаточно ли мала их разность, чтобы учесть ошибку округления и тот факт, что итерационные методы никогда не бывают точными).Вы повторяете это, пока не получите номер собственного значения, который вы ищете.Это будет медленно, но вы будете использовать только два собственных вектора в любое время.
ПРИМЕЧАНИЕ: мы предполагаем, что все собственные значения различны, в противном случае эта проблема не будет иметь решение с низким объемом памяти при использовании обычных методов.В общем случае, если максимальная кратность собственного значения равна m
, вам потребуется m
векторов в памяти для итерации подпространства.