From fc66144833a5e94863ba814618e2f678cef1efc4 Mon Sep 17 00:00:00 2001 From: PolishPigeon Date: Fri, 12 Nov 2021 08:41:21 +0100 Subject: [PATCH] Fixing QRNoShifts --- ENUME/projectA/QRNoShifts.asv | 39 ++++++++++++++------- ENUME/projectA/QRNoShifts.m | 64 +++++++++++++++++++++++------------ ENUME/projectA/QRShifts.m | 7 ++-- 3 files changed, 74 insertions(+), 36 deletions(-) diff --git a/ENUME/projectA/QRNoShifts.asv b/ENUME/projectA/QRNoShifts.asv index 4ee40386..ff3ed3ef 100644 --- a/ENUME/projectA/QRNoShifts.asv +++ b/ENUME/projectA/QRNoShifts.asv @@ -1,17 +1,8 @@ function [eigenValues, whichIterationAreWeOn, Matrix] = QRNoShifts(Matrix) + startingMatrix = Matrix; + matlabEigen = eig(Matrix); [whichIterationAreWeOn, threshold] = initializeValues(); - while threshold > 1e-6 - [Q, R] = gramSchmidtAlgorithm(Matrix); - Matrix = R * Q; - whichIterationAreWeOn = whichIterationAreWeOn + 1; - - % iterate until all non-diagonal elements are below the threshold - nondiag = Matrix - diag(diag(Matrix)); % first diag converts Matrix - % into vector consisting of values on the diagonal of matrix, - % second diag converts this vector into matrix with zeros on - % everything except diagonal - threshold = max(abs(nondiag)); - end + [Matrix, whichIterationAreWeOn, eigenValues] = QRNoShiftsLoop(threshold, Matrix, whichIterationAreWeOn); % convert eigenvalue matrix to vector eigenValues = diag(Matrix)'; @@ -21,6 +12,30 @@ function [eigenValues, whichIterationAreWeOn, Matrix] = QRNoShifts(Matrix) disp(Matrix); end +function [Matrix, whichIterationAreWeOn, eigenValues] = QRNoShiftsLoop(threshold, Matrix, whichIterationAreWeOn) + while threshold > 1e-6 + [Q, R] = gramSchmidtAlgorithm(Matrix); + Matrix = R * Q; + whichIterationAreWeOn = whichIterationAreWeOn + 1; + + % iterate until all non-diagonal elements are below the threshold + matrixWithoutDiagonal = Matrix - diag(diag(Matrix)); % first diag converts Matrix + % into vector consisting of values on the diagonal of matrix, + % second diag converts this vector into matrix with zeros on + % everything except diagonal + % If we substract it from Matrix we get original Matrix with zeros + % on a diagonal + threshold = max(abs(matrixWithoutDiagonal)); + end +end + +function displayResults(eigenValues, whichIterationsAreWeOn, Matrix, startingMatrix, matlabEigen) + disp("How many iterations it took:") + disp(whichIterationsAreWeOn); + disp("Starting matrix:") + disp(M) +end + function [whichIterationAreWeOn, threshold] = initializeValues() whichIterationAreWeOn = 0; threshold = inf; diff --git a/ENUME/projectA/QRNoShifts.m b/ENUME/projectA/QRNoShifts.m index 8669d237..31301c80 100644 --- a/ENUME/projectA/QRNoShifts.m +++ b/ENUME/projectA/QRNoShifts.m @@ -1,31 +1,51 @@ function [eigenValues, whichIterationAreWeOn, Matrix] = QRNoShifts(Matrix) - [whichIterationAreWeOn, threshold] = initializeValues(); - while threshold > 1e-6 - [Q, R] = gramSchmidtAlgorithm(Matrix); - Matrix = R * Q; - whichIterationAreWeOn = whichIterationAreWeOn + 1; - - % iterate until all non-diagonal elements are below the threshold - matrixWithoutDiagonal = Matrix - diag(diag(Matrix)); % first diag converts Matrix - % into vector consisting of values on the diagonal of matrix, - % second diag converts this vector into matrix with zeros on - % everything except diagonal - % If we substract it from Matrix we get original Matrix with zeros - % on a diagonal - threshold = max(abs(matrixWithoutDiagonal)); - end - - % convert eigenvalue matrix to vector + + [whichIterationAreWeOn, threshold, startingMatrix, matlabEigen] = initializeValues(Matrix); + [Matrix, whichIterationAreWeOn] = QRNoShiftsLoop(threshold, Matrix, whichIterationAreWeOn); eigenValues = diag(Matrix)'; - disp("Iterations it took: "); - disp(whichIterationAreWeOn); - disp("Final matrix: "); - disp(Matrix); + displayResults(whichIterationAreWeOn, Matrix, startingMatrix, matlabEigen); end -function [whichIterationAreWeOn, threshold] = initializeValues() +function [Matrix, whichIterationAreWeOn] = QRNoShiftsLoop(threshold, Matrix, whichIterationAreWeOn) + while threshold > 1e-6 + [Matrix, whichIterationAreWeOn, threshold] = QRNoShiftsInsideLoop(Matrix, whichIterationAreWeOn); + end +end + +function [Matrix, whichIterationAreWeOn, threshold] = QRNoShiftsInsideLoop(Matrix, whichIterationAreWeOn) + [Q, R] = gramSchmidtAlgorithm(Matrix); + Matrix = R * Q; + whichIterationAreWeOn = whichIterationAreWeOn + 1; + + % iterate until all non-diagonal elements are below the threshold + matrixWithoutDiagonal = Matrix - diag(diag(Matrix)); % first diag converts Matrix + % into vector consisting of values on the diagonal of matrix, + % second diag converts this vector into matrix with zeros on + % everything except diagonal + % If we substract it from Matrix we get original Matrix with zeros + % on a diagonal + threshold = max(max(abs(matrixWithoutDiagonal))); + % first max returns vector of elements + % second max returns max element from this vector +end + +function displayResults(whichIterationsAreWeOn, Matrix, startingMatrix, matlabEigen) + disp("How many iterations it took:") + disp(whichIterationsAreWeOn) + disp("Starting Matrix:") + disp(startingMatrix) + disp("Final Matrix:") + disp(Matrix) + disp("eig(Matrix) eigen values:") + disp(matlabEigen) + disp("Our eigen values:") +end + +function [whichIterationAreWeOn, threshold, startingMatrix, matlabEigen] = initializeValues(Matrix) whichIterationAreWeOn = 0; threshold = inf; + startingMatrix = Matrix; + matlabEigen = eig(Matrix); end % performs QR or QRdash decomposition of a matrix diff --git a/ENUME/projectA/QRShifts.m b/ENUME/projectA/QRShifts.m index feec8a68..17b0dbf9 100644 --- a/ENUME/projectA/QRShifts.m +++ b/ENUME/projectA/QRShifts.m @@ -1,9 +1,10 @@ % finds the eigenValues of a matrix using QR with shifts function [eigenValues, whatIterationAreWeOn, Matrix] = QRShifts(Matrix) eigenFromMatlab = eig(Matrix); + initialMatrix = Matrix; [eigenValues, whatIterationAreWeOn, matrixSize, minThreshold] = initiateValues(Matrix); [Matrix, whatIterationAreWeOn, eigenValues] = QRShiftLoop(matrixSize, Matrix, eigenValues, minThreshold, whatIterationAreWeOn); - dispResults(Matrix, whatIterationAreWeOn, eigenFromMatlab); + dispResults(Matrix, whatIterationAreWeOn, eigenFromMatlab, initialMatrix); end function [eigenValues, whatIterationAreWeOn, matrixSize, minThreshold] = initiateValues(Matrix) @@ -121,7 +122,9 @@ function [Q, R] = normalizeColumns(columns, Q, R) end end -function dispResults(Matrix, whatIterationAreWeOn, eigenFromMatlab) +function dispResults(Matrix, whatIterationAreWeOn, eigenFromMatlab, initialMatrix) + disp("Initial matrix: "); + disp(initialMatrix); disp("Final matrix: "); disp(Matrix); disp("Number of iterations: ");