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