WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Problem mit Gauß-Seidel-Iteration

 

Messerjocke
Forum-Newbie

Forum-Newbie


Beiträge: 3
Anmeldedatum: 15.01.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.01.2017, 12:24     Titel: Problem mit Gauß-Seidel-Iteration
  Antworten mit Zitat      
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))
 


Viele Grüße,
David
Private Nachricht senden Benutzer-Profile anzeigen


Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 15.01.2017, 13:25     Titel: Re: Problem mit Gauß-Seidel-Iteration
  Antworten mit Zitat      
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.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Messerjocke
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 3
Anmeldedatum: 15.01.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.01.2017, 13:55     Titel:
  Antworten mit Zitat      
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.

Viele Grüße,
David
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 15.01.2017, 20:09     Titel:
  Antworten mit Zitat      
Hallo Messerjocke,

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 .

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Messerjocke
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 3
Anmeldedatum: 15.01.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.01.2017, 20:40     Titel:
  Antworten mit Zitat      
Danke für die Hilfe!
Hab jetzt meinen Fehler gefunden. Habe beim Einarbeiten der Dirichlet-Randbedingung einen Fehler in der Matrix gemacht.
Private Nachricht senden Benutzer-Profile anzeigen
 
MK_K

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.12.2021, 14:39     Titel:
  Antworten mit Zitat      
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.?
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

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
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2024 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

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.