function Programmieraufgabe_Blatt1
close all %schließt alle existierenden plots

% initialisieren
h1 = 1e-02;
h2 = 1e-01;
startpoint = 0;
endpoint = 1;
% zu integrierende Funktion
f = @(x) exp(-x.^2); %function handle - .^2 erlaubt komponentenweise quadrieren bei vektoriellem input
% bestimmen der Integralapproximationen
val1 = Trapez(f,h1,startpoint,endpoint);
val2 = Trapez(f,h2,startpoint,endpoint);
% exakter Wert, vgl. "help erf"
exact_val = erf(1)*sqrt(pi)/2;
% output
fprintf('Für die Schrittweite h = %f ergibt sich der Wert %f.\n Für die Schrittweite %f ergibt sich der Wert %f.\n Der exakte Wert ist %f.\n', h1, val1, h2, val2, exact_val)
% Berechne Fehler für verschiedene h
Schritte = 15;
h = (1/2).^(1:1:Schritte);
Fehler = zeros(Schritte,1);
for i = 1:Schritte % Bemerkung: man könnte sich auch diese Schleife sparen, vgl. "help arrayfun".
    Fehler(i) = abs(Trapez(f,h(i),startpoint,endpoint) - exact_val);
end;
% plot - doppellogarithmisch
figure
loglog(h, Fehler,'r*-', h, h.^2, 'gd-');
legend('Fehler','x^2','location','best')


function val = Trapez(f,h,startpoint,endpoint)
% realisiert die Zusammengesetzte Trapezformel für das Integral von f
% zwischen dem Startpunkt (startpoint) und dem Endpunkt (endpoint), wobei
% die Schrittweite h verwendet wird

% Vektor mit Knoten
Knoten = startpoint:h:endpoint;
% f an den Knoten auswerten
eval_Knoten = f(Knoten);
% Approximation des Integralwertes bestimmen
val = h/2*(eval_Knoten(1)+eval_Knoten(end)) + h*sum(eval_Knoten(2:end-1));