%Predvedeme si iteracni metody

%zvolme pocet iteraci
iteraci=100;

%zvolime nahodnou matici, uvidime jeslti bude konvergovat, ke ktere pricteme jednotkovou diagonalni, zvysime tak pravdepodobnost ze vse bude konvergovat
A=rand(3)/2+eye(3)/2;

%zvolime pozadovane reseni, ze ktereho napocitame pravou stranu
origReseni=[1;1;1];

%najdeme pravou stranu
y=A*origReseni;

%zvolime nahodny uvodni odhad ze ktereho budeme iterovat
uvodniOdhad=rand(3,1);

%zvolime omega pro superrelaxaci, nebude optimalni, nevadi
omega=1.2;
%omega=0.6;

%PROSTA ITERACE
	%spocteme si matici B jako I-A
	B=eye(size(A))-A;

	%provedeme nekolik iteraci a vzdy vypiseme hledane reseni
	
	F=B;
	G=eye(size(F));

	clear vzdProstaIterace;
	x=uvodniOdhad;
	for i=1:iteraci
		x=F*x+G*y;
		vzdProstaIterace(i)=norm(x-origReseni);
	end;


%JACOBI

	L=tril(A,-1);
	R=triu(A,1);
	D=A-L-R;

	%provedeme nekolik iteraci a vzdy vypiseme hledane reseni
	
	F=-inv(D)*(L+R);
	G=inv(D);

	clear vzdJacobi;
	x=uvodniOdhad;
	for i=1:iteraci
		x=F*x+G*y;
		vzdJacobi(i)=norm(x-origReseni);
	end;

%GAUSS-SEIDEL

	L=tril(A,-1);
	R=triu(A,1);
	D=A-L-R;


	%provedeme nekolik iteraci a vzdy vypiseme hledane reseni
	
	F=-inv(D+L)*R;
	G=inv(D+L);

	clear vzdGaussSeidel;
	x=uvodniOdhad;
	for i=1:iteraci
		x=F*x+G*y;
		vzdGaussSeidel(i)=norm(x-origReseni);
	end;


%SUPERRELAXACE + GAUS-SEIDEL

	L=tril(A,-1);
	R=triu(A,1);
	D=A-L-R;


	%provedeme nekolik iteraci a vzdy vypiseme hledane reseni
	
	%toto je ze seidela
	F=-inv(D+L)*R;
	G=inv(D+L);

	clear vzdSuperRelaxace;
	x=uvodniOdhad;
	for i=1:iteraci
		xkp1=F*x+G*y;
		x=omega*(xkp1-x)+x;
		vzdSuperRelaxace(i)=norm(x-origReseni);
	end;



%ZOBRAZIME

	osaX=1:iteraci;

	plot(osaX,vzdProstaIterace,osaX,vzdJacobi,osaX,vzdGaussSeidel,osaX,vzdSuperRelaxace);
	%zobrazime legendu
	legend('Prosta iterace','Jacobi','Gauss-Seidel','Superrelaxace');
	%nastavime osu Y jako logaritmickou
	set(gca,'YScale','log');
