%% Wartości i wektory własne macierzy
%
%% Przykład 1. Wyznaczymy wartości i wektory własne macierzy \left\lbrack \begin{array}{ccc}
% 3 & 4 & 0\\
% -1 & -1 & 0\\
% -3 & 3 & -1
% \end{array}\right\rbrack.
%
% Polecenie eig(...) wyznacza wartości i wektory własne macierzy.
% Sprawdzimy, jakie wyniki otrzymamy dla macierzy w postaci symbolicznej oraz numerycznej.

A=[3 4 0;-1 -1 0;-3 3 -1] % postać numeryczna macierzy
As=sym(A) % postać symboliczna macierzy
eig(A) % w wektorze kolumnowym będą wypisane 3 wartości własne macierzy, wielokrotne będą powtórzone.
eig(As) % tutaj dokładne wartości

%

[C,D]=eig(A)  % inne wywołanie polecenia eig, w wyniku są dwie macierze

% Kolumny macierzy C, to wektory własne macierzy A odpowiadające kolejnym wartościom własnym
%  zapisanym na diagonali macierzy D.
% W wersji numerycznej podane są unormowane wektory własne (długości 1).
% Wartość własna 1 (podwójna) posiada 1-wymiarową przestrzeń własną, bo kolumny 2. i 3. macierzy C powtarzają się.

[Cs,Ds]=eig(As)   % wywołanie polecenia dla macierzy symbolicznej
% Jako wynik dostajemy macierze Cs i Ds. 
% Kolumny macierzy Cs to wektory własne, a na diagonali macierzy Ds są wartości własne macierzy
% A.

% W wersji symbolicznej dostaliśmy macierz Cs wektorów własnych, która ma tylko 2 kolumny.
% W pierwszej kolumnie jest wektor własny dla wartości własnej -1, a w drugiej dla podwójnej wartości własnej 1.
% Macierz A nie jest diagonalizowalna, bo z wektorów własnych nie można utworzyć bazy przestrzeni wymiaru 3. (Za mało wektorów własnych.)
%
%% Przykład 2. Wyznaczymy wartości i wektory własne macierzy \left\lbrack \begin{array}{ccc}
% -3 & -2 & 2\\
% 0 & -1 & 0\\
% -4 & -4 & 3
% \end{array}\right\rbrackbez użycia polecenia eig.
%

A=sym([-3 -2 2;0 -1 0; -4 -4 3])

%
%% Wyznaczymy wielomian charakterystyczny macierzy A oraz jego pierwiastki, czyli wartości własne macierzy A.

syms t % wielomian będzie zależał od zmiennej t
At=A-t*eye(3) % tworzymy macierz A-t*I
char_A=det(At) % wielomian charakterystyczny macierzy A, czyli wyznacznik macierzy A-t*I
wartosci=solve(char_A,t) 
% polecenie solve wyznacza pierwiastki wielomianu, czyli wartości własne macierzy A.

wsp_char_A=charpoly(A) % inny sposób uzyskania wielomianu charakterystycznego
% to polecenie podaje wielomian charakterystyczny  w postaci ciągu współczynników przy potęgach: 1,t,t^2,t^3,...

roots(wsp_char_A) % polecenie roots wyznacza pierwiastki wielomianu o zadanych współczynnikach.

%
%% Teraz wyznaczymy wektory własne macierzy A.
% Rozwiązujemy równania macierzowe (A-t*I)*X=0, podstawiając za t kolejne wartości własne macierzy A.

A_m1=subs(At,t,-1) % podstawiamy pierwszą wartość własną (podwójną) czyli -1
wekt_m1=null(A_m1) 
% rozwiązujemy układ jednorodny, polecenie null zwróci w kolumnach wektory bazy przestrzeni własnej dla t=-1.

% Otrzymaliśmy 2 wektory własne dla podwójnej wartości własnej, więc macierz A jest diagonalizowalna.
%

A_1=subs(At,t,1) % teraz wyznaczymy wektor własny dla wartości własnej t=1.
wekt_1=null(A_1)

%
%

C=[wekt_m1,wekt_1] % tworzymy macierz C, której kolumny to wektory własne macierzy A
D=diag(wartosci) % tworzymy macierz diagonalną D, która na przekątnej ma wartości własne macierzy A.

%
% Sprawdzimy, czy zachodzi warunek dla macierzy podobnych: A=C\cdot D\cdot C^{-1} \ldotp

A==C*D*inv(C)

%
% Dodatkowo sprawdzimy jeszcze czy wektory   \textrm{v1}=\left\lbrack \begin{array}{c}
% 1\\
% 1\\
% 1
% \end{array}\right\rbrack ,\;\;\textrm{v2}=\left\lbrack \begin{array}{c}
% 1\\
% 2\\
% 3
% \end{array}\right\rbrack   są wektorami własnymi macierzy A.

v1=sym([1 1 1]')
v2=sym([1 2 3]')

%
% Szukamy liczby l spełniającej równość  A*v=l*v

syms l
 l_v1=solve(A*v1==l*v1,l)  
l_v2=solve(A*v2==l*v2,l)      

% v1 nie jest wektorem własnym, a v2 jest wektorem własnym macierzy A odpowiadającym  wartości własnej -1.
%
%% Przykład 3. Wyznaczymy wartości własne losowej macierzy stopnia n
%%  i sprawdzimy, czy macierz jest diagonalizowalna.
% Uwaga: Macierz jest diagonalizowalna w sensie rzeczywistym, jeśli jest podobna do macierzy diagonalnej o wyrazach rzeczywistych.

n=10; % ustalamy wymiar macierzy
zakres=[-5,5];

An=randi(zakres,n); % generujemy macierz wymiaru nxn o losowych wyrazach całkowitych z podanego przedziału
[C,D]=eig(An); % wyznaczamy wektory i wartości własne macierzy
dim=rank(C) % wyznaczamy wymiar przestrzeni rozpietej przez wektory własne (liczbę różnych kolumn macierzy C)
dim==n % sprawdzamy, czy suma wymiarów przestrzeni własnych jest równa n
wart=diag(D) % wypisujemy wartości własne wygenerowanej macierzy
czy_real=imag(wart)==0 % sprawdzamy, czy kolejne wartości własne są rzeczywiste
ile_real=sum(czy_real) % sprawdzamy, ile jest wartości własnych rzeczywistych

%
% Jeśli nie wszystkie wartości własne są rzeczywiste, to macierz nie jest diagonalizowalna w sensie rzeczywistym.
% Aby  była diagonalizowalna w sensie rzeczywistym lub zespolonym, dodatkowo musi być spełniony warunek:
%  liczba otrzymanych różnych wektorów własnych ma być równa wymiarowi macierzy, czyli rząd macierzy C ma być równy n.