Das M-File 'showgauss.m' zeigt den Ablauf einer Gauß-Elimination Schritt für Schritt. Als Rückgabe-Werte sind der Lösungsvektor und die Dreiecksmatrix vorgesehen.
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, evtl. vertauschen
if A(kol,kol) == 0
[amx,kx] = max(abs(A(kol:n,kol)));
if amx == 0
disp( 'Matrix singulaer!' ); return
end
% Absoluter Vertauschungsindex, statt relativ zu kol
kx=kx+kol-1;
home
disp([' Zeilenvertauschung noetig: ', int2str(kol) , ' <==> ', int2str(kx) ])
% vertauschen Restzeilen
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 ausfuehren, da immer dieselbe
comb = A(lin,kol)/A(kol,kol);
% ~~~ entsprechende Zeilen kombinieren
% ~~~ Elementaufzaehlung 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