mirror of
https://github.com/kuhyx/WUT_Computer_Science.git
synced 2026-07-04 18:23:15 +02:00
38 lines
1.1 KiB
Matlab
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
|
|
|