%% TMA671 Lösning av uppgift N.5.44
clear;
% Under storgruppsövningen som hölls onsdagen den 14e Maj 2018
% så demonstrerades uppgift 44 i Kapitel 5 i Numerisk Analys
% boken. Uppgiften handlar om att approximera  de största och
% minsta egenvärdena till en matris med hjälp av potensmetoden
% och inversiteration till en matris
% Programmet är skrivet av Johannes Borgqvist

%% Definiera matrisen och startgissningen
A = [1, 2, 3, 0; 4, 1, 2, 5; 2, 1, 3, 1; 2, 3, 0, 4];% Matrisen
[r, c] = size(A); % Dimension på A
nuOfIter = 50; % Antal iterationer
% Vi beräknar egenvärdena med hjälp av ''eig ''
[V,D] = eig(A);
% Våra egenvärden
eigenValues = diag(D);
% Vi beräknar de största och minsta egenvärdena som facit
eigMax = max(eigenValues); % Största värde
eigMin = -min(abs(eigenValues)); % Minsta värde
% Vi skriver ut till användaren
% Skriv till användaren
fprintf('\n\n==============================================================================\n\n');
fprintf('\tUPPGIFT N.5.44: Approximera ett specifikt egenvärde\n\n');
fprintf('\n\n==============================================================================\n\n');
fprintf('\tResultat med eig:\n\n\t\tlambdaMax\t=\t%0.6f\n\n\t\t\t\t&\n\n\t\tlambdaMin\t=\t%0.6f\n\n',eigMax,eigMin);

%% Vi beräknar lambdaMax med potensmetod och lambdaMin med inversiteration
% För inversiteration använder vi inte pivotering utan gör det enkelt för
% oss
% Generera startgissningar
x = rand(r,1); % Potensmetod
y = rand(r,1); % Invers iteration

% Vi loopar igenom och utför dessa iterationer
% ''nuOfIter'' gånger 
for index = 1:nuOfIter
   x = A*x; % Potensmetod 
   y = A\y; % Invers iteration
   x = x/norm(x); % Normalisering potens 
   y = y/norm(y); % Normalisering invers     
end
% Beräkna lambdaMax från inversmetoden
lambdaMax = x'*(A*x);
% Beräkna lambdaMin från inversmetoden
lambdaMin = y'* (A*y);
% Skriv ut största egenvärde
fprintf('\tResultat med potens:\n\n\t\tlambdaMax\t=\t%0.6f\n\n',lambdaMax);
% Skriv ut minsta egenvärde
fprintf('\tResultat med invers:\n\n\t\tlambdaMin\t=\t%0.6f\n\n',lambdaMin);
fprintf('\n\n==============================================================================\n\n');
