|
Autor |
Gauß Seidel Verfahren in Matlab |
|
francesblue
Ehemals Aktiv  Dabei seit: 03.05.2004 Mitteilungen: 73
Wohnort: Berlin
 | Themenstart: 2004-05-27
|
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
|
N-man
Senior  Dabei seit: 15.10.2002 Mitteilungen: 2579
Wohnort: Zürich
 | Beitrag No.1, eingetragen 2004-05-30
|
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
|
Profil
|
francesblue
Ehemals Aktiv  Dabei seit: 03.05.2004 Mitteilungen: 73
Wohnort: Berlin
 | Beitrag No.2, vom Themenstarter, eingetragen 2004-05-30
|
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)
|
Profil
|
susi0815
Senior  Dabei seit: 20.11.2003 Mitteilungen: 1559
Wohnort: Hannover
 | Beitrag No.3, eingetragen 2004-06-01
|
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
|
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. |
|
All logos and trademarks in this site are property of their respective owner. The comments are property of their posters, all the rest © 2001-2023 by Matroids Matheplanet
This web site was originally made with PHP-Nuke, a former web portal system written in PHP that seems no longer to be maintained nor supported. PHP-Nuke is Free Software released under the GNU/GPL license.
Ich distanziere mich von rechtswidrigen oder anstößigen Inhalten, die sich trotz aufmerksamer Prüfung hinter hier verwendeten Links verbergen mögen. Lesen Sie die
Nutzungsbedingungen,
die Distanzierung,
die Datenschutzerklärung und das Impressum.
[Seitenanfang]
|