function [x] = sor(A,b,w,x,eps)
% SOR-Verfahren Lösung von LGS Ax=b
% A   Matrix des LGS
% b   Ergebniss des LGS (rechte Seite)
% w   Relaxionsparameter 
% x  Startvektor
% eps Fehlerschranke
% x   Ergeniss Vektor x 

% Prüfe, ob A und b gegeben
if nargin<2
    error('Eingabe ungültig'), end

% Prüfe, ob Matrix A quadratisch ist
[n,m]=size(A);
if n~=m
  error('A ist keine quadratische Matrix'), end

% Prüfe, ob b Spaltenvektor ist
[z,s]=size(b);
if s>1
   b=b'; end

% Prüfe, ob Dimension von Matrix A und Vektor b passt
if n~=size(b)
  error('Die Dimension von A und b passen nicht'), end

% Prüfe, ob w geg., und im korrekten Intervall
if nargin<3
    w=1.2; end
if w<=1, error('w nicht im Intervall(1,2]'), end
if w>2, error('w nicht im Intervall(1,2]'), end

% Prüfe, ob Startvektor geg., ansonsten setze Vektor auf 0    
n=length(b);
if nargin<4
   x=zeros(n,1); end

% Falls kein Abbruchkriterium geg., setze Ak auf 5E-6
if nargin<5
    eps=5E-6; end


m=0;
while true
    m=m+1;
    for k=1:n
        x(k)=(1-w)*x(k)+(w/A(k,k))*(b(k)-(A(k,:)*x-A(k,k)*x(k)));
    end
    
    fehler=sqrt(sum(abs(A*x-b).^2));
    if fehler<eps break,
    end
end

  