%Aufgabe 32, Einzel- (ESV) und Gesamtschrittverfahren (GSV), SS98
%ESV am Schluß x_7  =1.0e-06(-0.0885 -0.2525  0.1466  0.0050  0.0044)'
%GSV am Schluß x_11 =1.0e-05(-0.9095  0.5480  0.5824 -0.2576  0.5424)'
format compact
M=5;
A=[10 -8 0  0  0
   3   7 4  0  0
   0   1 3 -1  0
   0   0 1  4 -1 
   0   0 0  8 -9]; %Achtung: A ist zeilen- aber nicht spaltendiagonaldominant!
b=[0 0 0 0 0]';

%Gesamtschrittverfahren. Die neu berechneten Größen
%werden erst nach Ende einer Iteration weiterbenutzt.
%Das erm\"oglicht ein schnelles Programm.
disp('Gesamtschrittverfahren');
x=[1 1 1 1 1]';
y=x;
step=0;
Dh=diag(A);D=diag(Dh);Dh=1./Dh;D1=diag(Dh); %D1=D^-1
while norm(b-A*x,inf)>=10^-5 & step <=50
  y=D1*(b-(A-D)*x); %Faktor 10 schneller als Schleife
  x=y;
  step=step+1;
end; %while
[step,norm(b-A*x,inf)]

%Einzelschrittverfahren. Die neu berechneten Größen
%werden sofort weiterbenutzt. Das Programm ist aber langsam
disp('Einzelschrittverfahren');
x=[1 1 1 1 1]';
step=0;
while norm(b-A*x,inf)>=10^-5 & step <=50
  for i=1:M
    x(i)=(-A(i,1:i-1)*x(1:i-1)-A(i,i+1:M)*x(i+1:M)+b(i))/A(i,i);
  end; %for i
  step=step+1;%step,x
end; %while
[step,norm(b-A*x,inf)]

%Jetzt SOR-Verfahren. Die neu berechneten Größen
%werden sofort und gewichtet weiterbenutzt.
for omega=1.1:0.01:1.2
disp(['SOR-Verfahren mit omega  = ',num2str(omega)]);
x=[1 1 1 1 1]';
step=0;
while norm(b-A*x,inf)>=10^-5 & step <=50
  for i=1:M
    z(i)=(-A(i,1:i-1)*x(1:i-1)-A(i,i+1:M)*x(i+1:M)+b(i))/A(i,i);
    x(i)=omega*z(i)+(1-omega)*x(i);
  end; %for i
  step=step+1;
end; %while
[step,norm(b-A*x,inf)]
end; %for omega
%Ist beim obigen Beispiel A am besten für omega=1 (ESV)
