Verfasst am: 15.01.2017, 12:24
Titel: Problem mit Gauß-Seidel-Iteration
Hi,
nachdem ich im Forum immer mal wieder als Gast etwas mitgelesen habe,
melde ich mich jetzt mit einer Frage:
Ich soll eine Randwertaufgabe diskretisieren und das resultierende lineare Gleichungssystem mit Hilfe des Gauß-Seidel-Verfahrens lösen.
Dazu habe ich den folgenden Code geschrieben.
Problem ist, dass die Abweichung zur exakten Lösung, die ich am Ende berechne, mit einer größeren Anzahl Iterationsschritte größer wird.
Und ich finde leider meinen Fehler nicht.
Kann mir jemand helfen?
Code:
% Mein Script clear;
%Definitin n
n=399;
%Definition Schrittweite
h=1/400;
%Definition der Iterationsschritte
max_iter=20000;
%Definition der Koeffizienten
for j=1:n
x(j,1)=j*h;
p(j,1)=2*x(j)*(1-x(j));
lambda(j,1)=-1/h^2-p(j)/(2*h);
q(j,1)=6*x(j);
sigma(j,1)=q(j)+2/h^2;
mu(j,1)=p(j)/(2*h)-1/h^2;
end
%Definition der Einträge der Diagonalen der Matrix A
A=gallery('tridiag',lambda(2:n),sigma(1:n),mu(1:n-1));
A(n,n-1)=lambda(n)+mu(n);
%Definition der rechten Seite
s=@(x)6*x.^3-4*x.^2-8*x;
rs=s(x);
%Definition der Matritzen für Gauß-Seidel
D=diag(A,0); %Hauptdiagonale
E=-diag(A,-1); %Untere Diagonale
E=diag(E,-1); %Untere Diagonale neu festlegen
F=-diag(A,1); %Obere Diagonale
F=diag(F,1); %Obere Diagonale neu festlegen
M=D-E; %approximative Inverse
M_inv=inv(M);
%Iteration mit Gauß-Seidel
x0=0;
u_old=zeros(n,1);
for k=1:max_iter
u=M_inv*(F*u_old + rs);
u_old=u;
end
y=@(x)x.^3-x;
y_end=y(x);
abw=max(abs(u-y_end))
Verfasst am: 15.01.2017, 13:25
Titel: Re: Problem mit Gauß-Seidel-Iteration
Hallo Messerjocke,
Das lässt sich anhand des Codes nicht einfach beantworten. Man müsste sich z.B. ziemlich mühsam zusammenpuzzeln, welche Zeile denn nun die "exakte Lösung" von was ist. Vielleicht ist ja diese Berechnung falsch.
Die Aufgabenstellung zu sehen würde vielleicht helfen.
Danke schon mal für die Antwort.
Für mich zum Verständnis:
In x werden ja die einzelnen x_j abgelegt. Das heißt, x ist ein Vektor, in dem in jeder Komponente der Wert um die Schrittweite h erhöht wird.
Wenn ich unten die Approximation berechne, sollten die Werte von u in der selben Reihenfolge abgelegt werden.
Danach berechne ich ja nur noch die Norm (also das Maximum des Betrags zwischen Approximation und exakter Lösung).
Da der Fehler mit größerer Anzahl an Iterationen größer wird, vermute ich, dass ich irgendwo in der Schleife, in der der Gauß-Seidel-Algorithmus läuft, einen Fehler habe.
Richtig. M könnte falsch sein und damit M_inv, F, oder rs, oder die angeblich exakte Lösung.
M_inv könnte auch "richtig" sein, aber numerisch schlecht konditioniert. Der \ -Operator ist immer besser als die Inverse explizit auszurechnen. Siehe die Docs von
inv
.
Danke für die Hilfe!
Hab jetzt meinen Fehler gefunden. Habe beim Einarbeiten der Dirichlet-Randbedingung einen Fehler in der Matrix gemacht.
MK_K
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 23.12.2021, 14:39
Titel:
Hallo David,
dein Eintrag ist zwar schon ein paar Jahre alt, aber ich habe aktuell eine ähnliche Aufgabe.
Hast du vielleicht noch die Final richtige Version deines Progs.?
Einstellungen und Berechtigungen
Du kannst Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen. Du kannst Dateien in diesem Forum posten Du kannst Dateien in diesem Forum herunterladen
MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.