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

Gauß Seidel

 

Avernus
Forum-Anfänger

Forum-Anfänger


Beiträge: 19
Anmeldedatum: 08.05.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.05.2012, 17:43     Titel: Gauß Seidel
  Antworten mit Zitat      
Hallo
ich habe gerade ein Problem mit meiner Interpretation des Gauß-Seidel Algorithmus. Es wäre super wenn mich jemand auf meinen Fehler aufmerksam machen kann.


Der Algorithmus beruht auf der Formel von Wikipedia:
http://preview.tinyurl.com/d5bromx
LG

Code:

function x = GaussSeidel(A,b)
   
%input: Matrix A, rechte Seite b
%output: x Lösung des Systems

e=1e-12; % Konvergenzkriterium, nötige Genauigkeit
n=length(b);


x=zeros(n,1); % Startvektor

absr = norm(A*x-b);

while (absr >e)

    for j=1:n
        x(j)=(b(j)-A(j,1:j-1)* x(1:j-1)-A(j,j+1:n)* x(j+1:n))/A(j,j);
   
    end
   
    absr = norm(A*x-b);

end

   
end

 
Private Nachricht senden Benutzer-Profile anzeigen


MaFam
Forum-Meister

Forum-Meister


Beiträge: 799
Anmeldedatum: 02.05.12
Wohnort: ---
Version: R2009b
     Beitrag Verfasst am: 09.05.2012, 10:35     Titel:
  Antworten mit Zitat      
Hallo,

welcher Fehler tritt denn auf?

Grüße, MaFam
Private Nachricht senden Benutzer-Profile anzeigen
 
Avernus
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 19
Anmeldedatum: 08.05.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.05.2012, 10:39     Titel:
  Antworten mit Zitat      
es kommt bei einem Gleichungssystem nicht das richtige ergebnis heraus.

A=[1,-1,1;1,1,-2;3,-4,-7]
b=[-2;9;0]

das ergebnis sollte 3,4,-1 sein.
ich bekomme aber etwas völlig anderes.

Code:
1.0e+307 *

    0.8326
   -8.5860
       Inf
 
Private Nachricht senden Benutzer-Profile anzeigen
 
MaFam
Forum-Meister

Forum-Meister


Beiträge: 799
Anmeldedatum: 02.05.12
Wohnort: ---
Version: R2009b
     Beitrag Verfasst am: 09.05.2012, 10:54     Titel:
  Antworten mit Zitat      
Das Verfahren ist inhärent sequentiell, das bedeutet, dass deine rechte Seite ebenfalls von x_{m+1} abhängt. Ich würde hier ohnehin die Matrixschreibweise verwenden.
Private Nachricht senden Benutzer-Profile anzeigen
 
Avernus
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 19
Anmeldedatum: 08.05.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.05.2012, 11:09     Titel:
  Antworten mit Zitat      
Leider hilft mir deine Aussage nicht viel weiter. Das es inhärent sequentiell ist ist mir bewusst. Leider hilft mir beides im Hinblick auf einen funktionieren Code nicht weiter.

Hast du vielleicht einen konkreten Vorschlag?
Private Nachricht senden Benutzer-Profile anzeigen
 
MaFam
Forum-Meister

Forum-Meister


Beiträge: 799
Anmeldedatum: 02.05.12
Wohnort: ---
Version: R2009b
     Beitrag Verfasst am: 09.05.2012, 12:13     Titel:
  Antworten mit Zitat      
Beachte auch den Rest meines Beitrags. Schau' dir nochmal die Formel auf Wikipedia an. Dort taucht x^{m+1} auch auf der rechten Seite auf. Es ist eine Iteration der Form x^{m+1}=a(x^{m+1},x^m). Deine Iteration hat aber die Form x^{m+1}=b(x^m). Ich bin zudem konkret geworden, indem ich die Matrixschreibweise vorschlug. Dies steht auch in dem von dir verlinkten Artikel...
Private Nachricht senden Benutzer-Profile anzeigen
 
Avernus
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 19
Anmeldedatum: 08.05.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.05.2012, 12:36     Titel:
  Antworten mit Zitat      
Mir scheint du verstehst den Algorithmus von mir falsch.

Der zweite Teil A(...)*x(j+1:n) greift nur die "alten" x werte auf wie es in der FOrmel steht.

Trotzdem danke.
Private Nachricht senden Benutzer-Profile anzeigen
 
MaFam
Forum-Meister

Forum-Meister


Beiträge: 799
Anmeldedatum: 02.05.12
Wohnort: ---
Version: R2009b
     Beitrag Verfasst am: 09.05.2012, 12:46     Titel:
  Antworten mit Zitat      
Beide Terme in deiner Formel greifen auf die "alten" x-Werte zu, das ist der Fehler. Ich weiß leider nicht, wie ich das noch erklären soll...
Private Nachricht senden Benutzer-Profile anzeigen
 
MaFam
Forum-Meister

Forum-Meister


Beiträge: 799
Anmeldedatum: 02.05.12
Wohnort: ---
Version: R2009b
     Beitrag Verfasst am: 09.05.2012, 13:16     Titel:
  Antworten mit Zitat      
Also streng genommen hast du hier das Jacobi-Verfahren implementiert. Das muss allerdings auch funktionieren. Kommt deine Verwunderung über meine Anmerkungen vielleicht daher?
Deshalb habe ich mir den Code jetzt nochmal genau angeschaut. Ich vermute, dass der Fehler bei den Ausdrücken der Form Matrix(j,1:j-1) oder Vektor(1:j-1) liegen muss, denn für j=1 kommt nicht 0 zurück, sondern ein leeres Feld. Das müsste man beheben...
Private Nachricht senden Benutzer-Profile anzeigen
 
Avernus
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 19
Anmeldedatum: 08.05.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.05.2012, 15:34     Titel:
  Antworten mit Zitat      
Berichtige mich bitte falls ich etwas falsch verstanden habe:

Das Gauss Seidel verfahren nimmt bei jedem Schritt die neuen Werte, falls sie vorhanden sind, ansonsten die alten. Also für alle x(i) mit i<j, die neuen und für alle x(i) mit i>j die alten Werte. Oder habe ich das falsche interpretiert? Die neuen stehen doch erst zur Verfügung sobald ich Sie berechnet habe. Da ich in jedem Schritt einen neuen Wert generiere und ihn direkt ein Speicher verwende ich nur einen Vektor und lasse einmal auf den neuen und einmal auf den alten Teil zugreifen.

Danke für den Tipp mit dem leeren Feld, das habe ich wie folgt versucht zu beheben.

Code:

sum1=0;
sum2=0;


 if(j~=1)
            sum1=A(j,1:j-1)*x(1:j-1);  
        end
       
        if(j~=n)
            sum2= A(j,j+1:n)*x(j+1:n);
        end
 



Das ändert jedoch leider auch nichts an dem Problem.

Vielen Dank für deine Mühen.
Private Nachricht senden Benutzer-Profile anzeigen
 
MaFam
Forum-Meister

Forum-Meister


Beiträge: 799
Anmeldedatum: 02.05.12
Wohnort: ---
Version: R2009b
     Beitrag Verfasst am: 09.05.2012, 16:03     Titel:
  Antworten mit Zitat      
Deine Frage hat es in sich. Ich habe nun deinen Code überprüft. Er funktioniert. Verknüpfungen der Form [](1x0)*[](1x0) sind offenbar 0. Daran liegt es schon mal nicht. Allerdings muss ich bei meiner Aussage bleiben, dass hier nicht das Gauß-Seidel-Verfahren umgesetzt wurde von dir, sondern das Jacobi-Verfahren. Insofern liegt ein logischer Fehler vor.

Nun muss man sich fragen, warum der Code für das gegebene A nicht funktioniert. Dazu muss man A untersuchen und zwar den Spektralradius von D^{-1}(D-A). Dieser ist größer 1, deshalb divergiert das Verfahren.
Private Nachricht senden Benutzer-Profile anzeigen
 
MaFam
Forum-Meister

Forum-Meister


Beiträge: 799
Anmeldedatum: 02.05.12
Wohnort: ---
Version: R2009b
     Beitrag Verfasst am: 09.05.2012, 16:07     Titel:
  Antworten mit Zitat      
Teste deinen ursprünglichen Code mal mit A=[1,-1,1;1,1,-2;3,-4, 7]. Und überprüfe dann mit A\b. Es funktioniert.
Private Nachricht senden Benutzer-Profile anzeigen
 
Avernus
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 19
Anmeldedatum: 08.05.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.05.2012, 16:54     Titel:
  Antworten mit Zitat      
LOL, darauf muss man erstmal kommen. Danke für deine Hilfe.

Gibt es einen direkten Weg wie ich die Diagonal Matrix berechnen kann oder berechne ich die Eigenwerte und schreibe Sie dann in die diag?


Viele Grüße
Private Nachricht senden Benutzer-Profile anzeigen
 
Avernus
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 19
Anmeldedatum: 08.05.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.05.2012, 17:09     Titel:
  Antworten mit Zitat      
Starte doch mal diesen Code mit deiner Matrix. Dass dürfte dich vielleicht überzeugen dass es Gauss Seidel ist.
Ich zeige bei jedem Schritt den Aktuellen x Vektor.

Code:
function x = GaussSeidel(A,b)
   


e=10^(-8); % Konvergenzkriterium, nötige Genauigkeit
n=length(b); %Dimension des LGS

g=0; %Anzahl der Schritte, Schrittzähler

x=zeros(n,1); % x=Startvektor


absr = norm(A*x-b);


while (absr >e)
 
   disp('neue Iteration');
  g=g+1;
    %%---------------------------------------------------------------
    %%Hier startet die Gauß-Seidel Iteration!
    for j=1:n
       
   
    disp('-----------------------');
    j
  x
 
     x(j)=(b(j)-A(j,1:j-1)* x(1:j-1)-A(j,j+1:n)* x(j+1:n))/A(j,j);
    end
   
   absr=norm(A*x-b);
   if (g==3)
       stop;
   end
end

    disp('Es wurden so viele Schritte benötigt:')
    g
end

 
Private Nachricht senden Benutzer-Profile anzeigen
 
MaFam
Forum-Meister

Forum-Meister


Beiträge: 799
Anmeldedatum: 02.05.12
Wohnort: ---
Version: R2009b
     Beitrag Verfasst am: 09.05.2012, 17:11     Titel:
  Antworten mit Zitat      
Ja, A ist hier ein "hinterlistiges kleines Biest". Razz

Den Spektralradius habe ich so berechnet:

Code:

D=diag(diag(A));
M=inv(D)*(D-A);

spec=eig(M);
spec_rad=max(abs(spec))

 
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen

Gehe zu Seite 1, 2  Weiter

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 - 2025 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.