Простой алгоритм алгоритма Ланцоша для получения собственных значений и собственных векторов симметричной матрицы
Я хотел бы написать простую программу (на C) с использованием алгоритма Ланцоша. Я наткнулся на пример Matlab, который помог мне немного лучше понять алгоритм, однако из этого фрагмента кода я не могу найти способ получить собственные значения и собственные векторы. Я могу следовать алгоритму, но я думаю, что я что-то упускаю. Может кто-то руководствоваться, чтобы получить собственные значения из этого примера, чтобы я мог понять метод и затем кодировать его в C?
% Create a random symmetric matrix
D=6
for i=1:D,
for j=1:i,
A(i,j)=rand;
A(j,i)=A(i,j);
end
end
% Iteration with j=0
r0 = rand(D,1);
b0 = sqrt(r0'*r0);
q1 = r0/b0;
a1 = q1'*A*q1
%Iteration with j=1
r1 = A*q1 - a1*q1
b1 = sqrt(r1'*r1)
q2 = r1/b1;
a2 = q2'*A*q2
%Iteration with j=2
r2 = A*q2 - a2*q2 - b1*q1;
b2 = sqrt(r2'*r2)
q3 = r2/b2
a3 = q3'*A*q3
% Create Matrix Q
Q = [q1 q2 q3];
%Check orthogonality
EYE = Q'*Q
T = Q'*A*Q
1 ответ
В начальном методе Ланцоша сначала нужно посчитать наибольшее собственное значение матрицы A. После этого подсчитать собственный вектор, который соответствует этому собственному значению. Подсчитав эти два объекта, вы можете уменьшить размер используемой вами матрицы на один, а затем найти максимальное собственное значение новой матрицы. И вы должны повторить это m раз, где m это размерность исходной матрицы A.
Но если вы хотите посчитать все собственные значения одновременно, вы должны использовать итерационную процедуру Пейджа (см. В середине), в которой вы сначала строите трехдиогональную матрицу. Затем вы подсчитываете его собственные значения, используя один из известных и быстрых алгоритмов, так как такая матрица очень разрежена, и по формулам, указанным в статье выше, вы можете легко подсчитать собственные значения исходной матрицы и соответствующие им собственные векторы.