% Matrix condition number research. Polish version.
% Copyleft (<C), Temporal Research Centre
% Created by Jacek "TeMPOraL" Zlydach
% Last update: 2008-12-12

% Compatibility: Octave, Matlab (unchecked)

% skrypcik analizujacy wspolczynniki uwarunkowania dla macierzy
% i to, jak zaleza od rozmiaru samej macierzy

%stale
MAX_ROZMIAR = 300;
MAX_ILOSC = 10; %ilosc macierzy tego samego rozmiaru do przetworzenia

% zmienne
czasy = zeros(1, MAX_ROZMIAR*MAX_ILOSC); % pomiar czasu
normy = zeros(3, MAX_ROZMIAR*MAX_ILOSC);        %normy - kolumnowa(1), spektralna(2) i wierszowa (3)
normyInv = zeros(3, MAX_ROZMIAR*MAX_ILOSC);     %normy macierzy odrotnej, analogiczne
uwarunk = zeros(3, MAX_ROZMIAR*MAX_ILOSC);        % wspolczynniki uwarunkowania

%kod
for rozmiar = 2:MAX_ROZMIAR
  macierz = zeros(rozmiar, rozmiar);
  macierzInv = zeros(rozmiar, rozmiar);
  for ile = 1 : MAX_ILOSC
    macierz = rand(rozmiar) * 20 - 10;  %generuj losowa macierz
    
    tic();      %rozpocznij pomiar czasu
    
    macierzInv = inv(macierz);  % odwroc macierz
    normy(1, rozmiar*MAX_ILOSC+ile) = norm(macierz, 1);        % policz norme kolumnowa
    normyInv(1, rozmiar*MAX_ILOSC+ile) = norm(macierzInv, 1);
    
    normy(2, rozmiar*MAX_ILOSC+ile) = norm(macierz, 2);        % policz norme spektralna
    normyInv(2, rozmiar*MAX_ILOSC+ile) = norm(macierzInv, 2);
    
    normy(3, rozmiar*MAX_ILOSC+ile) = norm(macierz, inf);        % policz norme wierszowa
    normyInv(3, rozmiar*MAX_ILOSC+ile) = norm(macierzInv, inf);
    
    % policz wspolczynnik uwarunkowania macierzy
    uwarunk(1, rozmiar*MAX_ILOSC+ile) = normy(1, rozmiar*MAX_ILOSC+ile) * normyInv(1, rozmiar*MAX_ILOSC+ile);
    uwarunk(2, rozmiar*MAX_ILOSC+ile) = normy(2, rozmiar*MAX_ILOSC+ile) * normyInv(2, rozmiar*MAX_ILOSC+ile);
    uwarunk(3, rozmiar*MAX_ILOSC+ile) = normy(3, rozmiar*MAX_ILOSC+ile) * normyInv(3, rozmiar*MAX_ILOSC+ile);
    
    czasy(rozmiar*MAX_ILOSC+ile) = toc();      %zakoncz i zapisz pomiar czasu
  end
end

% prezentacja wynikow
%       mierzone czasy (performance)
%       wnioski z ogladania wykresu wskazuja, ze operacje odwracania macierzy
%       maja zlozonosc rzedu n^2, gdzie n - wymiar macierzy
figure;
title('Czasy');
plot(czasy);

%       normy na skali logarytmicznej
%       teoretycznie normy powinny wzrastac liniowo (przynajmniej wierszowe
%       i kolumnowe), ale to zostaje do sprawdzenia
%       norma spektralna jeszcze nie zbadana
figure;
hold on;
title('Normy');
semilogy(normy(1, :), 'g');
semilogy(normy(2, :), 'b');
semilogy(normy(3, :), 'r');
semilogy(normyInv(1, :), 'g^');
semilogy(normyInv(2, :), 'b^');
semilogy(normyInv(3, :), 'r^');
drawnow(); 

%       wspolczynniki uwarunkowania na skali logarytmicznej
%       pierwsze obserwacje sugeruja, ze te wspolczynniki dosc
%       szybko leca w kosmos; however trzeba to jeszcze dokladniej sprawdzic
%       teoretycznie rzecz biorac, wspolczynniki powinny rosnac co najwyzej kwadratowo,
%       poniewaz cond = ||A|| * ||inv(A)||
figure;
hold on;
title('Uwarunkowania');
semilogy(uwarunk(1, :), 'g');
semilogy(uwarunk(2, :), 'b');
semilogy(uwarunk(3, :), 'r');
drawnow(); 