function Hausaufgabe03_a
  h = [0.5, 0.2, 0.1, 0.01, 0.001, 0.0001];
  x_exakt = 0:0.001:3;
  y_exakt = exp(-x_exakt.^2)';
  
  fprintf('expl. Euler:\n');
  for i=1:6
      yeul = expleuler(0,3,h(i),1,@(x,y) -2*x*y);
     
      x = 0:h(i):3;
      plot(x,yeul,x_exakt,y_exakt);
      fprintf('Maximaler Fehler: %e\n', max(abs(yeul-exp(-x.^2)')));
      pause;
  end
  
  fprintf('\nHeun:\n');
  for i=1:6
      yheun = heun(0,3,h(i),1,@(x,y) -2*x*y);
      
      x = 0:h(i):3;
      
      plot(x,yheun,x_exakt,y_exakt);
      fprintf('Maximaler Fehler: %e\n', max(abs(yheun-exp(-x.^2)')));
      pause;
  end
end


function y = expleuler(a,b,h,y0,f)
  x = a:h:b;
  n = length(x);
  y = zeros(n,1);
  y(1) = y0;
  
  for i=1:n-1
      y(i+1) = y(i) + h*f(x(i),y(i));
  end
end

function y = heun(a,b,h,y0,f)
  x = a:h:b;
  n = length(x);
  y = zeros(n,1);
  y(1) = y0;
  
  for i=1:n-1
      k1 = y(i)+h*f(x(i),y(i));
      y(i+1) = y(i) + h/2*(f(x(i),y(i)) + f(x(i+1),k1));
  end
end

% Hausaufgabe03_a
% expl. Euler:
% Maximaler Fehler: 2.211992e-01
% Maximaler Fehler: 7.512367e-02
% Maximaler Fehler: 3.480306e-02
% Maximaler Fehler: 3.276919e-03
% Maximaler Fehler: 3.255376e-04
% Maximaler Fehler: 3.253212e-05
% 
% Heun:
% Maximaler Fehler: 3.514391e-01
% Maximaler Fehler: 9.580400e-03
% Maximaler Fehler: 2.052170e-03
% Maximaler Fehler: 1.825878e-05
% Maximaler Fehler: 1.806579e-07
% Maximaler Fehler: 1.804680e-09
