function [y]=eqsystem(A,b)
%EQSYSTEM   Funkce pro řešení systému lineárních rovnic tvaru A*x=y.
%   Y = EQSYSTEM(A,B) výstupem je textový řetězec řešení pro nezávisle
%   porměnné x1,x2,...,x28. V případě většího počtu řešení jsou parametry
%   značeny malými písmeny latinské abecedy.
%
%   Vstupní parametry funkce jsou matice A a sloupcový vektor B
%   odpovídajícíh rozměrů.
   
[m,n]=size(A);
[o,p]=size(b);

%Osetreni vstupnich parametru
if (p>1)
    error('Vstupni parametry neodpovidaji systému lin. rovnic tvaru A*x=y, "x" musí být sloupcový vektor nebo skalár!')
end

if m>n || n==1  || m~=o
    error('Vstupni parametry neodpovidaji soustému lin. rovnic tvaru A*x=y. Nevhodné rozměry matice "A" nebo vektoru "b"!')
end
 

Ab=[A,b];
[k,l]=size(Ab);

if rank(A)==rank(Ab)
  y=[];
  z=[];
  if rank(Ab)==n
  result=A\b;
  for i=1:n
       y=char(y,['x',num2str(i),' = ',num2str((result(i,:)))]);
  end
  disp('Řešeni systému rovnic A*x=y :');
  else
      %Prevod na radkove schodovity tvar a odstraneni nulovych radku
    result=(rref(Ab));
    result(all(result'==0)',:)=[];
      %Parametrizovane reseni pomoci partikularniho reseni
      %Predchozi krok resi problem vychazejici z nedostatecne presnosti
      %matlabu pro singularni matici
    base=null(result(:,1:(l-1)),'r'); %Baze nuloveho reseni
    particular=result(:,1:(l-1))\result(:,l); %Partikularni reseni
      %Zobrazeni vysledneho reseni
      %
      %Vlozeni partikularniho reseni do vysledku
    for i=1:n
       y=char(y,['x',num2str(i),' = ',num2str(particular(i,1))]);
    end
      %Vlozeni parametru do vysledku
      index=[];
    for i=1:n-rank(Ab)
        for k=1:n
            z=char(z,[' + (',num2str(base(k,i)),')*',char(96+i)]);
        end
        index=[index,' ',char(96+i)];
        y=[y,z];
        z=[];
    end
  disp(['Řešeni systému rovnic A*x=y. Parametry:',index]);
  end
  %Formatovani vysledku
  for i=1:n
    z=char(z,char(simple(sym(y(1+i,:)))));
  end
  y=z(2:n+1,:);
  %Nema-li rovnice reseni
else
    disp('Zadaný systém rovnic nemá rešeni');
end
