function Blatt11
% Dieser code realisiert zusätzlich auch noch das Abrbuchskriterium über
% das Monotoniekriterium des Banachschen Fixpunktsatzes.

clear % clears all variables
% Fixpunktiteration definieren
Phi = @(x1,x2) 1/6*[x1*exp(-x2^2) + x1*x2 + 3 , log(1+x2^2+x1^2)-1];
x0 = [0, -1]; % Startwert
Nmax = 10;
Anz_Iter = zeros(Nmax,3);
% Wir switchen zwischen den modi und speichern jeweils die Anzahl der
% benötigten Iterationen in der Matrix
for N = 1:Nmax
    mode = 'Monotonie';
    [~, Anz_Iter(N,1)] = Fixpunkt(Phi,x0,mode,N);
    
    mode = 'A-priori';
    [~, Anz_Iter(N,2)] = Fixpunkt(Phi,x0,mode,N);
    
    mode = 'A-posteriori';
    % Im letzten Schritt schauen wir uns auch den Iterationsverlauf an
    if N < Nmax
        [~, Anz_Iter(N,3)] = Fixpunkt(Phi,x0,mode,N);
    else
        [Iter , Anz_Iter(N,3)] = Fixpunkt(Phi,x0,mode,N);
        disp(Iter)
    end
end
plot(1:Nmax,Anz_Iter)
axis tight
legend('Monotonie','A-priori','A-posteriori','Location','Best') % mit Location kann man die Position der Legende verändern
xlabel('N')
ylabel('Anzahl Iterationen')
set(gcf,'Color','white') % macht den Hintergrund weiß
end


function [Iterierte, Anz_Iter] = Fixpunkt(Phi,x0,mode,N)
% Input:
% - Phi die Funktion der Fixpunktiteration
% - x0 der Startwert
% - mode spezifiziert mit welcher Abschätzung aus Satz 3.1 abgebrochen
% werden soll
% - N die Anzahl der gewünschten korrekten Nachkommastellen

q = 5/6; % die aus A 11.1 bekannte Lipschitzkonstante

switch mode
    case 'Monotonie'
        % Bestimme Anzahl benötigter Iterationen
        Anz_Iter = ceil((-log(2) - N*log(10))/log(q));
        % Initialisieren und Startwert setzen
        Iterierte = zeros(Anz_Iter,2);
        Iterierte(1,:) = x0;
        % Iteration durchführen
        for k = 2 : Anz_Iter+1
            x_old = Iterierte(k-1,:);
            Iterierte(k,:) = Phi(x_old(1),x_old(2));
        end
    case 'A-priori'
        % erste ITerierte bestimmen
        x1 = Phi(x0(1),x0(2));
        % Damit die Anzahl benötigter Iterationen
        Abstand = norm(x1-x0,Inf);
        Anz_Iter = ceil((-log(6*Abstand) - N*log(10))/log(q));
        % Initialisieren und erste Werte setzen
        Iterierte = zeros(Anz_Iter,2);
        Iterierte(1,:) = x0;
        Iterierte(2,:) = x1;
        % Iteration durchführen
        for k = 3 : Anz_Iter+1
            x_old = Iterierte(k-1,:);
            Iterierte(k,:) = Phi(x_old(1),x_old(2));
        end
    case 'A-posteriori'
        % Initialisieren und Startwert setzen
        Iterierte = [];
        Iterierte(1,:) = x0;
        % um nächste Iterierte erweitern und counter hochsetzen
        Iterierte = [Iterierte; Phi(x0(1),x0(2))];
        Anz_Iter = 1;
        % Abbruchskriterium bestimmen und checken
        Abstand = q/(1-q)*norm(Iterierte(Anz_Iter+1,:) - Iterierte(Anz_Iter,:),Inf);
        while Abstand > 1/(10^N)
            x_old = Iterierte(Anz_Iter+1,:);
            % um nächste Iterierte erweitern und counter hochsetzen
            Iterierte = [Iterierte; Phi(x_old(1),x_old(2))];
            Anz_Iter = Anz_Iter + 1;
            % Abbruchskriterium bestimmen und checken
            Abstand = q/(1-q)*norm(Iterierte(Anz_Iter+1,:) - Iterierte(Anz_Iter,:),Inf);
        end
end
end



