function [xsol,R] = showgauss(A,b)
%SHOWGAUSS Schrittweise Anzeige der Aktionen im Gauss-Algorithmus
%   showgauss(A,b) fuehrt die Gauss-Elimination fuer das System A*x=b durch
%   showgauss   ohne Parameter loest ein default-Gleichungssystem
%   Copyright 2002 HSZ-T, Zuerich , Dr. Stefan Adam
  if nargin < 1
%   Default-System
    b = [ 10  0  4 ]'  ;
    A = [  4  4  8 ;  2  -3   9 ; 1  2  2 ] ; 
  end
format rat;  more off; clc; home
% 
disp(' showgauss: Ablauf-Demonstration des Gauss-Algorithmus ')
disp(' Start-Geichungssystem:  A * x = b ')
 A, b
disp('<return> zum Weiterfahren ..'), pause
[m1,n1] = size(A);
n = max(m1,n1);
xsol = zeros(n,1);
%
% alle Spalten ausser der letzten, (beginnend mit 1)
for kol = 1:(n-1)
% Null-Test des Pivot-Kandidaten, ev. vertauschen
  if A(kol,kol) == 0
    [amx,kx] = max(abs(A(kol:n,kol)));
     if amx  == 0
      disp( 'Matrix singulaer!' )
       return
     end
% Absoluter Vertauschungs-Index, statt relativ zu kol
     kx=kx+kol-1;
home
disp([' Zeilenvertauschung noetig: ', int2str(kol) , ' <==> ', int2str(kx) ])
% vertauschen Rest-Zeilen
     hz=A(kol,kol:n);  A(kol,kol:n) = A(kx,kol:n);  A(kx,kol:n) = hz;
% vertauschen rechte Seiten
     hb = b(kol);    b(kol) = b(kx);    b(kx) = hb;
     A , b
  end
  Aol = A;
  bol = b; 
% Pivot-Absicherung OK, Kombinationen durchfuehren
% alle Zeilen unterhalb der Diagonalen
  for lin = (kol+1):n
% ~~~Division nur einmal ausf{\"u}hren, da immer dieselbe
    comb = A(lin,kol)/A(kol,kol);
% ~~~ entsprechende Zeilen kombinieren
% ~~~ Element-Aufzaehlung mit impliziter Schleife
    A(lin,kol:n) = A(lin,kol:n) - A(kol,kol:n)*comb;
    b(lin) = b(lin) - b(kol)*comb;
    R=A;  clc;  home
disp(' showgauss: Ablauf-Demonstration des Gauss-Algorithmus ')
    Aol , bol
disp([' Schritt ' int2str(kol) ' ,  Sub-Schritt ' int2str(lin-kol) ...
':  Element A(' int2str(lin) ',' int2str(kol) ')  wird  0 .  ' ...
 '( b wird angepasst )'])
disp(['      durch A(',int2str(lin),',:) = A(',int2str(lin),':) + (', ...
   num2str(-comb),')*A(',int2str(kol),',:)'   ])
    if (kol == n-1 ) & ( lin == n)
      R,b
    else
      A,b 
    end
    Aol = A;
    bol = b;
disp('<return> zum Weiterfahren ..'), pause
  end
end
% Schluss-Test auf Ann == 0
  if A(n,n)  == 0
    disp( 'Matrix singulaer!')
    R=0; xsol=0;
    return
  end
% Rueckwaerts-Einsetzen
  clc;  home
  R , b
disp('  Rueckwaerts-Einsetzen ')
% alle Zeilen/Unbekannten von unten nach oben
  for k=n:(-1):1
    xsol(k) = (b(k) -  A(k,(k+1):n)*xsol((k+1):n) )/A(k,k);
disp([' x(' int2str(k) ') = (' num2str(b(k)) ' - ' ...
 num2str( A(k,(k+1):n)*xsol((k+1):n) ) ' ) / ( '  num2str(A(k,k)) ...
 ' )   =  ' num2str(xsol(k)) ])
disp('<return> zum Weiterfahren ..'); pause
  end
xsol
