|
Autor |
Warum keine Konvergenz bei Relaxationsverfahren? |
|
neuneu
Ehemals Aktiv  Dabei seit: 31.01.2016 Mitteilungen: 44
 | Themenstart: 2016-03-26
|
Hallo,
ich habe folgendes Problem. Ich habe mir dieses Skript in Matlab geschrieben, um mir jeweils 5 Matrizen zu erzeugen, bei denen mittels Relaxationsverfahren bei LGS eine Lösung gefunden werden kann.
\sourceon Matlab
clear all;
clc;
% willkürliche Variablen erzeugen
%Strartwert für Iteration
x0=rand(3,1);
n=size(x0,1);
%A*x=b-->
b=rand(size(x0));
%max. Anzahl an Iterationsschritten
maxit=5000;
%Toleranz zwischen zwei aufeinanderfolgenden Vektoren aus dem Iterationsverfahren,
% bei dem die Iteration abgebrochen wird
tol=1e-07;
%Spektralradien
rho(1:5,1)=5;
%Matrizen finden, für die Relaxationsverfahren funktioniert
for i=1:5
A=rand(n,n);
while rho(i,1)>=1
A=rand(n,n);
[rho(i),C]=Spektralradius(A, 'ES');
if rho(i,1)<1
display(i);
display(rho(i,1), 'rho');
end
end
%Ausgabe zum Überprüfen, ob es bei diesen Matrizen funktioniert:
[x(1:n,i)]=RelaxationsVerfahren(A,b,x0,tol,maxit, 'ES');
Neu=zeros(n,4);
Neu(:,1)=A*x(1:n,i)-b;
Neu(:,2)=A*x(1:n,i);
Neu(:,3)=b;
disp(' A*x-b A*x b ');
disp(Neu);
end
\sourceoff
Dabei ist
1.)die Funktion [rho(i),C]=Spektralradius(A, 'ES') eine Funktion, die den zugehörigen Spektralradius im Einzelschrittverfahren zur Matrix A zurückliefert und
2.)[x(1:n,i)]=RelaxationsVerfahren(A,b,x0,tol,maxit, 'ES') liefert jeweils die Lösung x zum Gleichungssystem A*x=b zurück.
Das Problem ist nun, dass bei den so erzeugten Matrizen nicht zwangsläufig Grenzwerte, d.h. Lösungen für A*x=b existieren. Meine Frage ist nun, ob das theoretisch möglich ist oder ob ich irgendeinen Fehler in meinen Funktionen haben muss, denn der Spektralradius der entsprechenden Matrizen ist ja stets kleiner als 1?
Ich finde einfach keinen Fehler, aber verstehe nicht, wie es sein kann, dass hier das Iterationsverfahren teilweise nicht konvergiert.
Der Vollständigkeit wegen häng ich noch die beiden Funktion 1.) und 2.) an:
\sourceon Matlab
function [rho, C]=Spektralradius(A,option)
L=tril(A,-1);
R=triu(A,+1);
D=diag(diag(A));
%Gesamtschrittverfahren
if strcmp(option, 'GS')
C=D\(L+R);
rho=max(abs(eig(C)));
%Einzelschrittverfahren
elseif strcmp(option, 'ES')
C=(L+D)^(-1)*R;
rho=max(abs(eig(C)));
else display('Verfahren nicht bekannt');
end
end
\sourceoff
\sourceon Matlab
function [x]=RelaxationsVerfahren (A,b,x0,tol,maxit)
%Startvektoren
x(:,1)=x0;
x(:,2)=x0+2*tol*ones(size(x0));
%Optimales omega bestimmen
minimum=min(abs(eig(C)));
maximum=max(abs(eig(C)));
omega=2/(2-minimum-maximum);
%Matrizen für Relaxationsverfahren
%1.) A=L+D+R
L=tril(A,-1);
D=diag(diag(A));
R=triu(A,+1);
%2.)C(omega)=-(omega*L+D)*inv(((omega-1)*D+omega*R))
F=((omega-1)*D+omega*R);
Hilfe=(omega*L+D);
Comega=(-1)*Hilfe\F;
domega=omega*Hilfe\b;
%Startwert für Iteration
nit=2;
while max(abs(x(:,nit)-x(:,nit-1)))>tol
x(:,nit+1)=Comega*x(:,nit)+domega;
nit=nit+1;
if nit ==maxit+1
display('konvergiert nicht oder zu langsam!');
break;
end
end
%Alle Vektoren der Iteration sind in Matrix x abgespeichert, letzter dieser
%Vektoren ausgeben und als x speichern
d=size(x,2)-1;
x=x(:,d);
end
end
\sourceoff
Wäre euch sehr dankbar, wenn mir da Jemand weiterhelfen könnte. Mir geht es nämlich eher um die Theorie dahinter. Falls irgendjemand entdeckt, dass ich manche Sachen sehr unsauber mache, wäre ich über Hinweise dankbar.
Gruß und schon mal danke schön,
neuneu
|
Profil
|
majoka
Senior  Dabei seit: 25.02.2014 Mitteilungen: 814
 | Beitrag No.1, eingetragen 2016-04-06
|
Hallo,
vielleicht würde es Dir schon helfen, wenn Du Deinen Code besser formatierst (in Matlab: Text markieren und STRG+I).
Ich vermute nämlich, dass Du die Überprüfung nur durchführen möchtest, falls rho<1:
\sourceon Matlab
clear all;
clc;
% willkürliche Variablen erzeugen
%Strartwert für Iteration
x0=rand(3,1);
n=size(x0,1);
%A*x=b-->
b=rand(size(x0));
%max. Anzahl an Iterationsschritten
maxit=5000;
%Toleranz zwischen zwei aufeinanderfolgenden Vektoren aus dem Iterationsverfahren,
% bei dem die Iteration abgebrochen wird
tol=1e-07;
%Spektralradien
rho(1:5,1)=5;
%Matrizen finden, für die Relaxationsverfahren funktioniert
for i=1:5
A=rand(n,n);
while rho(i,1)>=1
A=rand(n,n);
[rho(i),C]=Spektralradius(A, 'GS');
if rho(i,1)<1
display(i);
display(rho(i,1), 'rho');
[x(1:n,i)]=RelaxationsVerfahren(A,b,x0,tol,maxit);%, 'ES');
%Ausgabe zum Überprüfen, ob es bei diesen Matrizen funktioniert:
Neu=zeros(n,4);
Neu(:,1)=A*x(1:n,i)-b;
Neu(:,2)=A*x(1:n,i);
Neu(:,3)=b;
disp(' A*x-b A*x b ');
disp(Neu);
end
end
end
\sourceoff
Im Relaxationsverfahren läuft auch noch irgendwas schief. Ich habe diese einfachere Variante verwendet (Anfangswerte gleich null):
\sourceon Matlab
function [x]=RelaxationsVerfahren (A,b,x0,tol,maxit)
%Matrizen für Relaxationsverfahren
%1.) A=L+D+R
L=tril(A,-1);
D=diag(diag(A));
R=triu(A,+1);
%Startwert für Iteration
nit=2;
[m,n]=size(A);
x=zeros(n,1);
xn=[];
xold = ones(n,1);
while max(abs(x-xold))>tol
xold = x;
x=-inv(D)*(L+R)*x+inv(D)*b;
xn = [xn x];
nit=nit+1;
if nit ==maxit+1
display('konvergiert nicht oder zu langsam!');
break;
end
end
%end
\sourceoff
Gruß,
majoka.
|
Profil
|
neuneu hat die Antworten auf ihre/seine Frage gesehen. |
|
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]
|