20. Gauß Algorithmus

Transcription

20. Gauß Algorithmus
106.986 UE Numerische Mathematik für LA
GOTTHART Lukas
20. Gauß Algorithmus
Man schreibe ein MATLAB–Programm, das den Gauß Algorithmus einmal ohne Pivot
und einmal mit Spaltenpivot durchführt. Testen Sie das Programm anhand des Beispiels
A~x = ~b mit
aij =
1
,
i+j−1
bi =
1
,
N +i−1
i, j = 1, 2, . . . , N
Geben Sie jeweils für N = 10, 25, 50, 100 die Werte des Lösungsvektors ~x an.
Gegeben ist eine reguläre Matrix A ∈ Rn×n und ein Vektor b ∈ Rn und gesucht ist eine
Lösung des Systems
A~x = ~b
Die Grundidee der Gaußelimination ist es die gegebene erweitere Matrix (der Lösungsvektor ~b wird der Matrix A als letzte Spalte hinzugefügt) durch elementare Zeilenumformungen auf Dreiecksgestalt zu bringen. Dadurch hat man in der letzten Zeile nur
noch eine Unbekannte, die nun leicht berechnet werden kann. Diese Information wird in
die vorletzte Zeile eingesetzt, wodurch auch diese Zeile eine lineare Gleichung in einer
Unbekannten wird,. . .
Da das Verfahren anfangs so erklärt wird, dass man mit der obersten Zeile die Elemente
der ersten Spalte unterhalb der ersten Zeile eliminiert und dann analog mit der rechten
unteren (n − 1) × (n − 1) Teilmatrix fortsetzt, kann eine 0 an der Position (1,1) in der
Teilmatrix ein Problem liefern. Dieses wird gelöst indem man diese Zeile mit einer Zeile
unterhalb die an entsprechender Stelle ein Element 6= 0 hat tauscht.
Vom Standpunkt der Numerik sollten nicht nur 0er getauscht werden, sondern auch
kleine Elemente. Man sucht also zunächst in der betrachteten Spalte das betragsmäßig
größte Element und tauscht dann die entsprechenden Zeilen.
Erzeugung der Testmatrizen aus der Angabe:
function [M,b]=testmatrix(N)
M=zeros(N);
b=zeros(N,1);
for i=1:N
b(i)=1/(N+i-1);
for j=i:N
M(i,j)=1/(i+j-1);
M(j,i)=M(i,j);
end
end
106.986 UE Numerische Mathematik für LA
GOTTHART Lukas
Gaußalgorithmus ohne Pivotsuche:
function x=gaussalg(M,b)
if det(M)==0
display(’Matrix ist singulär’)
end
M(:,end+1)=b; %erweiterte Matrix
d=size(M,1); %Anzahl der Zeilen
for i=1:d
if M(i,i)==0 %wenn Element in Hauptdiagonal 0 ist
n=find(M(i+1:end,i),1); %suche in Spalte darunter Element 6= 0
h=M(i,:); % und tausche
M(i,:)=M(i+n,:);
M(i+n,:)=h;
end
M(i,:)=M(i,:)/M(i,i); %Element in Hauptdiagonal Wert 1
for j=i+1:d
M(j,:)=M(j,:)-M(j,i)*M(i,:); %Abziehen zum Erreichen der Stufenform
end
end
x=zeros(d,1);
for i=d:-1:1
x(i)=M(i,1:end-1)*(-x)+M(i,end); %Berechnung des Lösungsvektors
end
106.986 UE Numerische Mathematik für LA
GOTTHART Lukas
Gaußalgorithmus mit Pivotsuche:
function x=gaussalgpiv(M,b)
if det(M)==0
display(’Matrix ist singulär’)
end
M(:,end+1)=b; %erweiterte Matrix
d=size(M,1); %Anzahl der Zeilen
for i=1:d
[w,n]=max(abs(M(i:end,i))); %wert und pos des größten werts (pivotsuche)
h=M(i,:); %Tauschen der Zeilen
M(i,:)=M(i+n-1,:);
M(i+n-1,:)=h;
M(i,:)=M(i,:)/M(i,i); %Element in Hauptdiagonal Wert 1
for j=i+1:d
M(j,:)=M(j,:)-M(j,i)*M(i,:); %Abziehen zum Erreichen der Stufenform
end
end
x=zeros(d,1);
for i=d:-1:1
x(i)=M(i,1:end-1)*(-x)+M(i,end); %Berechnung des Lösungsvektors
end
Die Berechnungen der Lösungen der Testmatrizen ergeben jeweils den Vektor
x = (0, . . . , 0, 1)T , da die letzte Spalte gleich dem Lösungsvektor ist.
Der Test mit einigen zufällig erstellten Matrizen und Lösungsvektoren lieferte aufgrund
MATLAB–interner Rundungen keine exakten Lösungen. Die Untersuchung von kA~x −~bk
legt die Vermutung nahe, dass der Algorithmus mit Pivotsuche zumindest eine Größenordnung besser ist als die Variante ohne Pivotsuche.
Ein Test mit einer 100 × 100 Matrix mit Zufallszahlen aus dem Intervall [-100,100] und
analogem Lösungsvektor ergab beispielsweise:
• max(abs(Ax-b))=3.2315e-011 ohne Pivotsuche
• max(abs(Ax-b))=6.1107e-013 mit Pivotsuche
• norm(Ax-b)=7.7250e-011 ohne Pivotsuche
• norm(Ax-b)=1.9172e-012 mit Pivotsuche