function [x] = sor(A,b,omega) 

% sor l"ost das System
%   A x = b
% mittels der ged"ampften sor-Iteration
% (falls das Verfahren konvergiert)
% Der Aufruf ist [x] = sor(A,b,omega)
% A - (n x n) Matrix
% b - n-dimensionaler Vektor rechte Seite
% omega aus (0,2) - D"ampfungsparameter 
% als Startwert wird der Nullvektor genommen

% kontrolliere, ob alle Dimensionen passen
[n,m] = size(A);
if n ~= m
  error('A ist keine quadratische Matrix')
end
if n ~= size(b)
  error('Die Dimension von A und b passen nicht')
end

% maximale Anzahl der Iterationen
maxit = 1000;

% Startvektor
x_alt = zeros(n,1);

% Abbruchkriterium
eps = 1e-8;

% die Iteration
for i= 0:maxit
  % berechne neue Iterierte
  x_neu = x_alt;
  for j = 1:n
    s = b(j) - A(j,1:n) * x_neu;
    x_neu(j) = x_neu(j) + omega*s/A(j,j);
  end
  norm_aenderung = norm(x_neu-x_alt);
  s = sprintf('Iteration %d  Aenderung der Iterierten %g',...
               i, norm_aenderung);
  disp(s);
  % falls die Aenderung der Iterierten klein genug, dann breche ab
  if (norm_aenderung < eps)
    break;
  end

  % speichere Iterierte f"ur n"achtste Iteration um
  x_alt = x_neu;

end

% vergleiche iterative L"osung mit direkter L"osung
y = A\b;
fehler = y - x_neu;
s = sprintf('Fehler zur L"osung mit Gauss-Verfahren %g',...
             norm(fehler));
disp(s);

  




