Matroids Matheplanet Forum Index
Moderiert von mire2
Mathematische Software & Apps » Matlab » Warum keine Konvergenz bei Relaxationsverfahren?
Autor
Universität/Hochschule Warum keine Konvergenz bei Relaxationsverfahren?
neuneu
Ehemals Aktiv Letzter Besuch: vor mehr als 3 Monaten
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 Letzter Besuch: in der letzten Woche
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.

Wechsel in ein anderes Forum:
 Suchen    
 
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]