%% Wyznaczanie odwrotności macierzy i obliczanie wyznacznika.
%% Metoda eliminacji - operacje na wierszach.

 clear;
close all;

%
%% Wyznaczanie macierzy odwrotnej - metoda eliminacji (operacje na wierszach)
% Zapisujemy zadaną macierz jako A. Tworzymy macierz E jednostkową o takich wymiarach jak zadana macierz. Tworzymy macierz AE z dwóch kwadratowych bloków A i E.
% Wykonujemy na macierzy AE serię operacji na wierszach w celu uzyskania w miejscu bloku A macierzy jednostkowej. Po uzyskaniu zamierzonego celu w miejscu bloku E będzie macierz odwotna do A.
%% Przykład 1.
%% Wyznaczymy macierz odwrotną do macierzy\left\lbrack \begin{array}{ccc}
% 2 & 1 & -1\\
% 3 & 7 & 0\\
% -1 & 2 & 1
% \end{array}\right\rbrack

A=sym([2 1 -1;3 7 0; -1 2 1])
det(A)
E=eye(size(A))   % macierz jednostkowa takiego wymiaru jak A
AE=[A E]    % macierz rozszerzona

%
% Zamiana kolejności wierszy, by w pierwszej kolumnie wyraz -1 był w pierwszym wierszu

AE=AE([3 2 1],:) % nowa kolejność wierszy: od góry - trzeci, drugi, pierwszy

%
% Wykonujemy takie operacje, by w miejscu pierwszej kolumny uzyskać pierwszą kolumnę macierzy jednostkowej.

AE(2,:)=AE(2,:)+3*AE(1,:) % do drugiego wiersza dodajemy pierwszy pomnożony przez 3
AE(3,:)=AE(3,:)+2*AE(1,:) % do trzeciego wiersza dodajemy pierwszy pomnożony przez 2
AE(1,:)=(-1)*AE(1,:)   % pierwszy wiersz mnożymy przez -1.

%
% Wykonujemy operacje w celu modyfikacji drugiej kolumny (potrzebujemy 1 w 2. lub 3. wierszu drugiej kolumny)

AE(2,:)=AE(2,:)-3*AE(3,:) % od drugiego wiersza odejmujemy trzeci pomnożony przez 3

%

AE(3,:)=AE(3,:)+2*AE(2,:) % do trzeciego wiersza dodajemy drugi pomnożony przez 2

%
% Uzyskaliśmy 1 w 3. wierszu, wykorzystamy ten wiersz, do otrzymania zer w pozostałych wyrazach drugiej kolumny.

AE(1,:)=AE(1,:)+2*AE(3,:) % do pierwszego wiersza dodajemy trzeci pomnożony przez 2
AE(2,:)=AE(2,:)+2*AE(3,:)  % do drugiego wiersza dodajemy trzeci pomnożony przez 2

%

AE=AE([1 3 2],:) % zmieniamy kolejność wierszy, % tak by 1 z drugiej kolumny było w drugim wierszu

%
% Wykonujemy operacje w celu modyfikacji trzeciej kolumny

AE(3,:)=AE(3,:)./2 % dzielimy trzeci wiersz przez 2, by otrzymać 1

%

AE(1,:)=AE(1,:)-AE(3,:) % od pierwszego wiersza odejmujemy trzeci
AE(2,:)=AE(2,:)-AE(3,:) % od drugiego wiersza odejmujemy trzeci

%
% Macierz odwrotna do A składa się z trzech prawych kolumn macierzy AE

Aodwr=AE(:,[4 5 6]) % tworzymy macierz zbudowaną z trzech ostanich kolumn macierzy AE

%
% Sprawdzamy, czy rzeczywiście Aodwr jest macierzą odwrotną do A

inv(A)
Aodwr*A  % sprawdzamy warunki z definicji macierzy odwrotnej do A
isequal(A*Aodwr,sym(eye(3)))

%
%% Drugi sposób - bardziej automatyczny. Przy okazji obliczymy w = wyznacznik macierzy A.

A=sym([2 1 -1;3 7 0; -1 2 1])
w=1   % ustalamy początkową wartość wyznacznika jako w=1
E=eye(size(A));
AE=[A E]

%
% Wartość startową w wyznacznika ustawiamy na 1. Będziemy wartość w mnożyć przez czynniki wyłączane z wierszy. Przy zmianie kolejności wierszy należy pomnożyć w przez znak odpowiedniej permutacji.
% Pierwszy wiersz dzielimy przez wyraz a11, aby uzyskać tam wyraz równy 1.
%% Uwaga: gdyby wyraz a11 był równy 0, to należy najpierw wykonać takie operacje na wierszach, po których a11 będzie niezerowy.

w=w*AE(1,1) % w mnożymy przez wyraz, przez który dzielimy wiersz I
% (wyłączamy ten czynnik z wiersza).
AE(1,:)=AE(1,:)./AE(1,1) % Dzielimy wiersz I przez wyraz a11

%
% Od wiersza 2. i 3. odejmujemy wielokrotność wiersza 1. aby uzyskać zera w 1. kolumnie.
% Te operacje nie zmieniają wyznacznika.

AE(2,:)=AE(2,:)-AE(2,1).*AE(1,:) % od wiersza II odejmujemy wiersz I pomnożony przez wyraz a21
AE(3,:)=AE(3,:)-AE(3,1).*AE(1,:) % od wiersza III odejmujemy wiersz I pomnożony przez wyraz a31

%
% Drugi wiersz dzielimy przez wyraz na przekątnej (a22), aby uzyskać tam wartość 1.
% Następnie od wiersza 1. i 3. odejmujemy wielokrotność wiersza 2. aby uzyskać zera w 2. kolumnie.

w=w*AE(2,2) % dzieląc wiersz II przez wyraz a22, wyłączamy ten czynnik przed wyznacznik
AE(2,:)=AE(2,:)./AE(2,2)
AE(1,:)=AE(1,:)-AE(1,2).*AE(2,:)
AE(3,:)=AE(3,:)-AE(3,2).*AE(2,:)

%
% Trzeci wiersz dzielimy przez wyraz (a33) na przekątnej, aby uzyskać tam 1.
% Następnie od wiersza 1. i 2. odejmujemy wielokrotność wiersza 3. aby uzyskać zera w 3. kolumnie.

w=w*AE(3,3)
AE(3,:)=AE(3,:)./AE(3,3)
AE(1,:)=AE(1,:)-AE(1,3).*AE(3,:)
AE(2,:)=AE(2,:)-AE(2,3).*AE(3,:)

%
% Macierz odwrotna do A to prawy kwadratowy blok macierzy AE

odwrA=AE(:,[4 5 6])
wyznacznik=w

%
%% Trzeci sposób - z wykorzystaniem macierzy dołączonej
%

A=sym([2 1 -1;3 7 0; -1 2 1])
AD=adjoint(A) % AD to macierz dołączona (transponowana macierz dopełnień algebraicznych)
w=det(A)
Aodwr=AD./w

%
% Sprawdzamy fakt z wykładu  A*AD=AD*A=det(A)*I

A*AD
AD*A

%
%% Przykład 2.
%% Obliczymy wyznacznik macierzy B=\left\lbrack \begin{array}{cccc}
% 2 & 1 & 1 & 1\\
% 1 & 2 & 1 & 1\\
% 1 & 1 & 2 & 1\\
% 1 & 1 & 1 & 2
% \end{array}\right\rbrack

B=sym(ones(4)+diag(ones(1,4)))
w=1 % Ustawiamy startową wartość wyznacznika, którą będziemy mnożyć przez czynniki wyłączane z wierszy lub kolumn. 

%

B(1,:)=B(1,:)+B(2,:)+B(3,:)+B(4,:) % Do wiersza I dodajemy pozostałe, nie zmienia to wyznacznika.

%

w=w*B(1,1) % wiersz I dzielimy przez wyraz B(1,1), a wyznacznik mnożymy przez tę liczbę
B(1,:)=B(1,:)./B(1,1)

%
% Odejmujemy wiersz I od pozostałych

B(2,:)=B(2,:)-B(1,:);
B(3,:)=B(3,:)-B(1,:);
B(4,:)=B(4,:)-B(1,:) 

%
% Odejmowanie wierszy nie zmieniło wyznacznika. Uzyskaliśmy macierz trójkątną o wyznaczniku 1.
% Ostatecznie wyznacznik =w.

wyzn=w