#=================================================#
# Dies ist der Maple source zum                   #
# Gaussalgorithmus mit partieller Pivotwahl       #
#                                                 #
# Erwartet wird, dass die Dimmension n, die       # 
# Matrix a, die rechte Seite b sowie der Pivot-   #
# vektor iPiv und die Loesung lagu schon          #
# deklariert sind.                                #
#=================================================#

# init Pivotpointer
for i from 1 to n do iPiv[i]:=i: od: 

ag:=augment(a,b); # setze a und b zu (a,b) zusammen

# Gausselimination mit partieller Pivotwahl
for i from 1 to n-1 do 
  maxA:=abs(ag[iPiv[i],i]);   # suche die Pivotzeile
  maxI:=i;  
  for j from i+1 to n do 
    if (ag[iPiv[j],i] > maxA) then 
      maxA:=ag[iPiv[j],i]; 
      maxI:=j; 
    fi 
  od;  
  if (maxI <> i) then	    # Pivotzeigerupdate 
    iHelp:=iPiv[maxI]; 
    iPiv[maxI]:=iPiv[i]; 
    iPiv[i]:=iHelp;
  fi;  
printf(`Pivot: %d\n`, iPiv[i]);
  for j from i+1 to n do    # Gausselimination
    Piv:=ag[iPiv[j],i]/ag[iPiv[i],i];   
printf(`%d %10.5f -- `, iPiv[j], Piv);
    for k from i to n+1 do 
      ag[iPiv[j],k]:=ag[iPiv[j],k]-Piv*ag[iPiv[i],k];  
printf(`%10.5f `, ag[iPiv[j],k]);
    od; 
printf(`\n`);
  od:
printf(`\n`);
od:  

ag:=evalm(ag);   # zeige das Zwischenergebnis
# Rueckwaertseinsetzen
for i from n to 1 by -1 do 
  lgau[i]:=ag[iPiv[i],n+1]; 
  for j from i+1 to n do 
    lgau[i]:=lgau[i]-ag[iPiv[i],j]*lgau[j]; 
  od; 
  lgau[i]:=lgau[i]/ag[iPiv[i],i]; 
od: 
 
x:=evalm(lgau); # zeige die Loesung
