Auswahl Aktion im Forum Suche Kontakt Für Mitglieder Mathematisch für Anfänger Wer ist Online | |
| Autor |
Gauß Seidel Verfahren in Matlab |
|
francesblue
Aktiv  Dabei seit: 03.05.2004 Mitteilungen: 73
Aus: Berlin
 |     Themenstart: 2004-05-27 21:41
|
Hallo
Da mir letztens so gut mit der LR Zerlegung geholfen wurde wollte ich nochmal fragen ob mir jemand bei dem Gauß Seidel Verfahren helfen kann!
 
Der Aufruf des Programms lautet x=solve(a,b,c,d,x0,tol,nmax) Es soll Ax=d lösen A soll nicht als n x n Matrix gespeichert werden sonder nur die Hauptdiagonale a und die Nebendiagonalen c und b! x0 ist der Startvektor x soll alle Iterierten x_k Spaltenweise enthalten Es soll Abgebrochen werden wenn norm(Ax_k-d)_2 + norm(x_k-x_(k-1))_2 < tol oder sobald nmax überschritten wird
1) Wie speichere ich meine x(k) so das sie Spaltenweise in x stehen?
2) Wie ungefair muss das Programm in Matlab aussehen?
Danke
|
Profil
Quote
Link |
N-man
Senior  Dabei seit: 15.10.2002 Mitteilungen: 2566
Aus: Zürich
 |     Beitrag No.1, eingetragen 2004-05-30 13:18
|
Hallo du!
Also... ich hab kein Matlab hier und kann es ohne Hilfe schlecht aus dem Kopf... also alles ohne Gewähr.
1.)
x ist nun eine Matrix und in jedem Schritt hängst du eine Spalte an, das geht mittels
x=(x,xk)
dabei ist xk die Lösung der k-ten Iteration in Form eines Spaltenvektors. Es kann sein, dass man statt runder eckige Klammern braucht.
2.)
Zunächst solltest du dir die Bandmatrix basteln. Das geht ganz gut, glaub ich, mit dem Befehl "spdiag"... da hilft die Hilfe weiter, aber keine Garantie, dass der Befehl wirklich so heißt.
Und dann baust du dir eine Schleife, irgendwie der Art...
while ...>tol AND Anzahl<nmax
In der Schleife führst du deine Iteration aus und erhöhst Anzahl.
----------------- Das ist eine Grußzeile.
|
Profil
Quote
Link |
francesblue
Aktiv  Dabei seit: 03.05.2004 Mitteilungen: 73
Aus: Berlin
 |     Beitrag No.2, vom Themenstarter, eingetragen 2004-05-30 13:55
|
Hallo
Hier mein Programm
 
function x=solve1(a,b,c,d,x0,tol,nmax,par) [n,m]=size(a); A=zeros(n,n); [s,t]=size(b); [k,l]=size(c) b(n)=0 c(n)=0 A=diag(a(1:n)); B=diag(b(1:n-1),-1); C=diag(c(1:n-1),+1); A=A+B+C A*x0 x(1)=a(1)*x0(1)+(b(1)*x0(2)) %x(2)=c(1)*x0(1)+a(2)*x0(2)+b(2)*x0(3) x(n)=c(n-1)*x0(n-1)+a(n)*x0(n) for i=2:n x(i)=c(i-1)*x0(i)+a(i)*x0(i+1)+b(i)*x0(i+2) size(x(i)) end x(n)=c(n-1)*x0(n-1)+a(n)*x0(n) %entweder x=[x,neuervektor] %oder x(:,i)=neuervektor switch (par) case 1 D = diag(a) ; L = diag(b(1:n-1),-1) ; U = diag(c(1:n-1),1) ; x=[n]; i = 2; while i<=nmax x0=x(1); x(i)=inv(D)*(L+U)*x(i-1)+inv(D)*b; if sqrt((mvmult(a,b,c,x0))^2-d^2)+sqrt(x(i)^2+x(i-1)^2)<tol break; end i=i+1; end case 2 D = diag(a) ; L = diag(b(1:n-1),-1) ; U = diag(c(1:n-1),1) ; x=[n] ; i = 2; while i<=nmax x0=x(1) x(i)=inv(D-L)*(U)*x(i-1)+inv(D-L)*b; if sqrt((mvmult(a,b,c,x0))^2-d^2)+sqrt(x(i)^2+x(i-1)^2)<tol break; end i=i+1; end end
Hallo Weiß noch immer nicht so genau wo ich das mit dem Speichern machen soll!
Wäre toll wenn du dazu noch etwas weißt!
|
Profil
Quote
Link |
susi0815
Senior  Dabei seit: 20.11.2003 Mitteilungen: 1553
Aus: Hannover
 |     Beitrag No.3, eingetragen 2004-06-01 19:50
|
Hi,
warum so ein Aufwand ?
Das ist ja mit Kanonen auf Spatzen schießen !
Du kennst doch sicher die elementweisen Formeln für das Gauß-Seidel-Verfahren, die kann man ganz leicht auf den Fall mit den Nebendiagonalen übersetzen.
Das nutzt dann zwar nicht die Möglichkeiten von matlab mit Inversen usw. aus, ist aber viel kürzer und schneller als das da.
Gruß, Susi.
|
Profil
Quote
Link |
francesblue hat die Antworten auf ihre/seine Frage gesehen. Das Thema wurde von einem Senior oder Moderator abgehakt. | | francesblue wird per Mail über neue Antworten informiert. | |
| [Neues Thema] [Druckversion] |
|