% Metoda potęgowa dla zadania własnego _____________________________

% Wyznacza najmniejszą wartość własną macierzy kwadratowej.
%
% Argumenty:
%     A: macierz kwadratowa.
%     x: wektor początkowy.
%     tol: dokłandość obliczeń.
% ____________________________________________________________


% Wczytanie argumentów _________________________________________
clc; clear
%A = [[1, 2, 0]; [2, 1, 1]; [0, 1, 0];];
%A = [6 5 -5; 2 6 -2; 2 5 -1];
%A = [3 0 0; -4 6 2; 16 -15 -5];
%A = [4 1 0; 1 4 1; 0 1 4];
%A = [5 4 3; -1 0 -3; 1 -2 1]; % dwukrotna wartość własna 4.
%A = [2 1 0; 1 2 1; 0 1 2];
%x = [1;1;1];

%A = [1 2 1; 0 1 3; 2 1 1]; % dwie zespolone wartości własne.
%x = [1+i; i; 0];

%A = [10 -2 3 2 0; -2 10 -3 4 5; 3 -3 6 3 3; 2 4 3 6 6; 0 5 3 6 13];
%x = [1;2;3;4;5];


A = [2 -12; 1 -5];
x = [1; 1];

tol = 10^(-3);

iter = 0;
lambda = 0;

A_pierwotna = A; % zapisanie macierzy A;
A = A\eye(length(x));  % utworzenie macierzy odwrotnej.

while tol < norm(A*x-lambda*x)
    y = A*x;
    iter = iter +1;
    %lambda = dot(x,y)/dot(x,x);
    lambda = y(1)/x(1);,
    x = y;
    x = x/norm(x);
   
end

A = A_pierwotna; % powrót do pierwotnej macierzy A.
lambda = 1 / lambda; % obliczenie najmniejszej wartości własnej.
disp('Norma macierzy:');
disp(norm(A*x-lambda*x));
disp('Liczba iteracji:')
disp(iter);
disp('Najmniejsza wartość własna:')
disp(lambda);
disp('Odpowiadający jej wektor własny:');
disp(x);