%
% Serie 03, Aufgabe 2b
% diese kann im Prinzip auch durch wiederholte Durchläufe des
% Programms zur Aufgabe 2a mit anschliessender Berechnung des
% relativen Fehlers gelöst werden
%
% m.file um die quadratische Gleichung x*x + p*x + q = 0 zu loesen
%
% Die Nullstellen sind eps und 1 
% 
% Obwohl beide Algorithmen mathematisch äquivalent sind, sind sie
% es auf dem Computer nicht. Während Alg. 3.3 Ergebnisse mit einem
% relativen Fehler (fast immer) Null liefert, steigt der relative
% Fehler für Algorithmus 3.2 bei sinkendem eps an, bis zu 100%
% bei eps = 1e-17 !!! Für die Numerik ist Alg. 3.3 besser geeignet!

% Eingabe der beiden Parameter
clear
format long g

for i=1:5
    % das kann durch eine switch Abfrage ersetzt werden, die
    % war aber noch nicht in der Vorlesung
    if (i==1)
        eps = 1e-10;
    elseif (i==2)
        eps = 1e-12;
    elseif (i==3)
        eps = 1e-14;
    elseif (i==4)
        eps = 1e-16;
    elseif (i==5)
        eps = 1e-17;  
    end
    disp('eps')
    disp(eps)
    
    p = -(1+eps);
    q = eps;
    
    % Berechnung und Ausgabe der Loesung

    a = -p/2;
    D = a*a-q;

    % Algorithmus 3.2 aus dem Skript

    disp('Algorithmus 3.2')
    if (D>=0)
        x1 = a+sqrt(D)
        x2 = a-sqrt(D)   
    else  %kann nicht auftreten
        sprintf('keine reelle Loesung !')
    end

    disp('relativer Fehler der kleineren Nullstelle')
    disp(abs(x2-eps)/eps)
    
    % Algorithmus 3.3 aus dem Skript

    disp('Algorithmus 3.3')
    if (D<0)
        sprintf('keine reelle Loesung !')   
    else
        if (a<0)
            x1 = a-sqrt(D)
            x2 = q/x1
        elseif (a>0) % nur dieser Zweig wird abgearbeitet
            x1 = a+sqrt(D)
            x2 = q/x1
        else
            x1 = sqrt(-q)
            x2 = -x1
        end   
    end
    disp('relativer Fehler der kleineren Nullstelle')
    disp(abs(x2-eps)/eps)
    pause()
end
