%  Mingzhi Zhong , Yu Wang 
function [] = prog1main()

zhongwang=[5,10,20,40,80];

eps=1e-6; 
% Verwenden die verschiedenen Schrittweiten ein nach andere
for i=1:5
  s=zhongwang(i)
  h=1/s;
%   Weisen die Matrix A zu 
  for i= 1:19
    for j = 1:19 
       if(i==j)
         A(i,j)=-2/(h*h);
       elseif (1==abs(i-j))
               A(i,j)=1/(h*h);
           else A(i,j)=0;
       end 
    end 
  end 
    
  for i=1:19
    n=i/20;
%     Weisen Anfangswert zu
    exp(i)=n*(1-n);
    imp(i)=n*(1-n);
    for j=1:19
        if (i==j)
           I(i,j)=1; % Danach wird benutzt AA zu berechnen 
        end
    end     
  end
%     Expliziter Euler-Verfahren    
  for j=1:s 
      y=h*A*(exp');
      exp=exp+(y');
  end
%   Rechnen die Matrix AA um Iteration zu benutzen AA*x=b
  AA=I-h*A;
%     Impliziter Euler-Verfahren
  for j=1:s
      imp=GSS(AA,imp);
  end
  
  disp('expliziter Euler')
  disp(exp')
  disp('impliziter Euler')
  disp(imp')
  
end
    
function gs=GSS(A,b)
%  init x und  t
 for i=1:19
      x(i)=0;
      t(i)=0;
 end
 % erst mal Gauss-Seidel Verfahren um r0 und ri zu init  
 for i=1:19
       for j=1:19
          if  (i~=j)
              t(i)=t(i)+A(i,j)*x(j);
          end
       end
       x(i)=(b(i)-t(i))/A(i,i);

       for i=1:19
          t(i)=0;
       end 
 end
%  init r und rr
    r=x;
    rr=r; 
% Gauss-Seidel Verfahren bis die Ziel zu erreichen   
 while norm(rr)>eps*norm(r) 
    rr=x;
    for i=1:19
       for j=1:19
          if  (i~=j)
             t(i)=t(i)+A(i,j)*x(j);
          end
       end
       x(i)=(b(i)-t(i))/A(i,i);
       for i=1:19
          t(i)=0;
       end 
    end
    rr=x-rr;
  end
%return x vom Parameter A und b ;
 gs=x; 
 
function ny = norm(y)
  g=0;
  for i=1:19
    g=g+y(i)^2;
  end
% return die Norm von y   
ny=sqrt(g);