%=========================================================================
%     PRIME METODY PRO RESENI SOUSTAV LINEARNICH ALGEBRAICKYCH ROVNIC
%=========================================================================


%-------------------------------------------------------------------------
% function [x,gem_error]=gem(A,b);
% Gaussova eliminan metoda 
% pro reseni soustavy Ax=b
%-------------------------------------------------------------------------


A=[3 2 1; 2 4 5; 3 4 8]; b=[10 25 35]';   
gem(A,b);

A=[4 5 6 7; 8 10 5 1; 2 6 1 3; 4 1 3 6]; b=[60 47 29 39]';   
gem(A,b);


%-------------------------------------------------------------------------
% function x=gem_sloupcova_pivotace(A,b);
% Gaussova eliminan metoda se sloupcovou pivotac
% pro reseni soustavy Ax=b
%-------------------------------------------------------------------------

A=[4 5 6 7; 8 10 5 1; 2 6 1 3; 4 1 3 6]; b=[60 47 29 39]';   
gem_sloupcova_pivotace(A,b);



%-------------------------------------------------------------------------
% function [L,U] = lu_rozklad(A);
% Metoda LU rozkladu pro ctvercovou matici A
%-------------------------------------------------------------------------

A=[3 2 1; 2 4 5; 3 4 8] 
[L,U]=lu_rozklad(A)

A=[4 5 6 7; 8 10 5 1; 2 6 1 3; 4 1 3 6];
[L,U]=lu_rozklad(A)



%-------------------------------------------------------------------------
% function x=lu_metoda(A,b);
% Metoda een soustavy Ax=b pomoci
% metody LU rozkladu matice A
%-------------------------------------------------------------------------

A=[3 2 1; 2 4 5; 3 4 8]; b=[10 25 35]';   
lu_metoda(A,b);



%=========================================================================
%   ITERACNI METODY PRO RESENI SOUSTAV LINEARNICH ALGEBRAICKYCH ROVNIC
%=========================================================================


%-------------------------------------------------------------------------
% function [x,nm_error,iteraci,H] = jacobi(A, b, x_0, tolerantion, max_iter);
% Jacobiova metoda pro reseni soustavy rovnic Ax=b
%
%	vstupn parametry:
%	A			- matice soustavy
%	b			- vektor prav strany
%	x_0			- poten aproximace (vektor)
%	tolerantion		- nastaven poadovan pesnosti (slo)
%	max_iter		- nastaven maximlnho potu iterac (slo)
%
%	vstupn paramery:
%	x			- posledn aproximace een
%	nm_error		- euklidovsk norma rozdlu
%				  dvou po sob jdoucch aproximac
%	iteraci			- poet iteranch krok metody
%-------------------------------------------------------------------------

% A =[6 -3 1; 4 -2 1; 1 3 6];
% b=[15 16 1]'; 
% x0=[0 0 0]'; 
% tolerantion=0.01;
% max_iter=200;
% jacobi(A, b, x0, tolerantion, max_iter);

jacobi([6 -3 1; 4 -2 1; 1 3 6],[15 16 1]',[0 0 0]',0.01,200);


%-------------------------------------------------------------------------
% function [x,nm_error,iteraci,H] = gauss_seidel(A, b, x0, tolerantion, max_iter);
% Gauss-Seidelova metoda pro reseni soustavy rovnic Ax=b
%-------------------------------------------------------------------------

% A =[6 -3 1; 4 -2 1; 1 3 6];
% b=[15 16 1]'; 
% x0=[0 0 0]'; 
% tolerantion=0.01;
% max_iter=200;
% gauss_seidel(A, b, x0, tolerantion, max_iter);

gauss_seidel([6 -3 1; 4 -2 1; 1 3 6],[15 16 1]',[0 0 0]',0.01,200);


%-------------------------------------------------------------------------
% function [x,nm_error,iteraci,H] = sor(A, b, x0, omega, tolerantion, max_iter);
% Relaxacni metoda SOR pro reseni soustavy rovnic Ax=b
%    omega - relaxan parametr 
%-------------------------------------------------------------------------

% A =[6 -3 1; 4 -2 1; 1 3 6];
% b=[15 16 1]'; 
% x0=[0 0 0]'; 
% omega=1.1;
% tolerantion=0.01;
% max_iter=200;
% sor(A, b, x0, omega, tolerantion, max_iter);

sor([6 -3 1; 4 -2 1; 1 3 6],[15 16 1]',[0 0 0]',   1.2   ,0.01,200);

sor([6 -3 1; 4 -2 1; 1 3 6],[15 16 1]',[0 0 0]',   1.4   ,0.01,200);

sor([6 -3 1; 4 -2 1; 1 3 6],[15 16 1]',[0 0 0]',  1.536  ,0.01,200);



%-------------------------------------------------------------------------
% function omega = optimalni_omega(A);
% Urceni optimalniho parametru omega pro metodu SOR 
%-------------------------------------------------------------------------

optimalni_omega([6 -3 1; 4 -2 1; 1 3 6]);




%------------------------------------------------------------------------
%                       Specialni pripady
%------------------------------------------------------------------------

A=[1 2 -2; 1 1 1; 2 2 1];
b=[1 3 5]';
x0=[0 0 0]'; 
tolerantion=0.01;
max_iter=20;

[x,nm_error,iteraci,H_J]=jacobi(A, b, x0, tolerantion, max_iter);
[x,nm_error,iteraci,H_GS]=gauss_seidel(A, b, x0, tolerantion, max_iter);

%  Vlastni cisla iteracni matice Jacobiovy metody 
 eig(H_J)
%  Vlastni cisla iteracni matice Gauss-Seidelovy metody 
 eig(H_GS)

%------------------------------------------------------------------------

A=[5 3 4; 3 6 4; 4 4 5];
b=[12 13 13]';
x0=[0 0 0]'; 
tolerantion=0.01;
max_iter=20;

[x,nm_error,iteraci,H_J]=jacobi(A, b, x0, tolerantion, max_iter);
[x,nm_error,iteraci,H_GS]=gauss_seidel(A, b, x0, tolerantion, max_iter);

% Vlastni cisla iteracni matice Jacobiovy metody
 eig(H_J)
% Vlastni cisla iteracni matice Gauss-Seidelovy metody  
 eig(H_GS)



%=========================================================================
%               Geometricky vyznam iteracnich metod
%=========================================================================

jacobi_G;

gauss_seidel_G

sor_G(0.8);

sor_G(1.25);


%=========================================================================
%                         GRADIENTNI METODY
%=========================================================================

gradientni_metody_I

gradientni_metody_II

metoda_nejvetsiho_spadu_2D;

metoda_nejvetsiho_spadu_3D;

mns_1;

mns_2;


metoda_sdruzenych_gradientu_2D;

metoda_sdruzenych_gradientu_3D;







