WUT_Computer_Science/ENUME/references/ENUME_ProjectA_No31/task 4/eigenvalueQRshift.m
2021-11-10 13:12:25 +01:00

38 lines
1.1 KiB
Matlab

function [eigenvalues,iteration,Afinal] = eigenvalueQRshift(A)
%EIGENVALUEQRSHIFT calculates eigenvalues using the QR method with shifts
% returns eigenvalues, the number of iterations and the transformed
% matrix A
n = size(A, 1);
eigenvalues = diag(ones(n));
initialSub = A;
iteration = 0;
for k = n:-1:2
DK = initialSub;
while max(abs(DK(k, 1:k-1))) > 10^-6
DD = DK(k-1:k, k-1:k);
[ev1, ev2] = quadpolynroots(1, -(DD(1,1) + DD(2,2)), DD(2,2) * DD(1,1) - DD(2,1) * DD(1,2));
if abs(ev1 - DD(2, 2)) < abs(ev2 - DD(2, 2))
shift = ev1;
else
shift = ev2;
end
DP = DK - eye(k) * shift;
[Q, R] = QRfactorize(DP);
DK = R * Q + eye(k) * shift;
iteration = iteration + 1;
end
eigenvalues(k) = DK(k, k);
A(1:k, 1:k) = DK(1:k, 1:k);
if k > 2
initialSub = DK(1:k-1, 1:k-1);
else
eigenvalues(1) = DK(1, 1);
end
end
Afinal = A;
end