clc
format bank
disp('   ');
disp('                             >>>>>>>>>>>>>>>Darstellung gebrochenrationaler Funktionen<<<<<<<<<<<<<<<')
disp('   ');disp('   ');
disp('     Gegeben sei die Funktion:')
disp('   ');
disp('                               f(x)=   (x³+a1x²+a2x+a3)/(b1x²+b2x+b3)')
disp('   ');
%Eingabe der Koeffizienten
a=input('Geben Sie die Werte der Koeffizienten im Zähler ein! Hinweis: [a1 a2 a3] ');
b=input('Geben Sie die Werte der Koeffizienten im Nenner ein! Hinweis: [b1 b2 b3] ');

x=-5:0.1:5;
zaehler=(x.^3+a(1)*x.^2+a(2)*x+a(3));
nenner=(b(1)*x.^2+b(2)*x+b(3));
y=(zaehler./nenner);

Zcoeff=[1 a(1) a(2) a(3)];
null=roots(Zcoeff);
null=null(imag(null)==0);
Ncoeff=[b(1) b(2) b(3)];
pol=roots(Ncoeff);
pol=pol(imag(pol) == 0); % dich interessieren ja nur die realen

% Analyse der Polstellen
DL = []; % Initialisierung
for I=1:length(pol) % Analyse der Polstellen
    if I <= length(pol) && abs(pol(I).^3+a(1)*pol(I).^2+a(2)*pol(I)+a(3)) < 1e-8
        DL = [DL; pol(I)]; % das ist kein Pol, sondern eine Def.-Lücke
        null(abs(null - pol(I)) < 1e-8) = []; % und auch keine Nullstelle
        pol(I) = [];
    end
end

disp(' ')
disp('(1) Wertetabelle');disp(' ')
disp('(2) Nullstellen');disp(' ')
disp('(3) Polstellen');disp(' ')
disp('(4) Definitionslücken');disp(' ')
disp('(5) Grafik');disp(' ')
disp('(6) Programm beenden');disp(' ')
auswahl= input('Eingabe einer Zahl: ','s');
while (auswahl ~= 0)
    switch auswahl
        case '1'
            % Wertetabelle
            clc
            disp('      x          y')
            disp([x(:), y(:)])
            disp(' ')
            pause
            disp('(1) Wertetabelle');disp('(2) Nullstellen');disp('(3) Polstellen');disp('(4) Definitionslücken');disp('(5) Grafik');disp('(6) Programm beenden');disp(' ')
            auswahl= input('Eingabe einer Zahl: ','s');
        case '2'
            %Nullstellen berechnen
            clc
            disp('   ');
            disp('Nullstellen:')
            disp('   ');
            disp(null(:))
            pause
            disp('(1) Wertetabelle');disp('(2) Nullstellen');disp('(3) Polstellen');disp('(4) Definitionslücken');disp('(5) Grafik');disp('(6) Programm beenden');disp(' ')
            auswahl= input('Eingabe einer Zahl: ','s');
        case '3'
            %Polstellen
            clc
            disp('   ');
            if ~isempty(pol)
                disp('Polstellen:')
                disp('   ');
                disp(pol(:))
            else
                disp('Es gibt keine Polstellen!')
            end
            pause
            disp('(1) Wertetabelle');disp('(2) Nullstellen');disp('(3) Polstellen');disp('(4) Definitionslücken');disp('(5) Grafik');disp('(6) Programm beenden');disp(' ')
            auswahl= input('Eingabe einer Zahl: ','s');
        case '4'
            %Definitionsluecken
            clc
            disp('   ');
            if ~isempty(DL)
                disp('Definitionslücke:')
                disp('   ');
                disp(DL(:))
            else
                disp('Es gibt keine Definitionslücken!')
            end
            disp('   ');
            pause
            disp('(1) Wertetabelle');disp('(2) Nullstellen');disp('(3) Polstellen');disp('(4) Definitionslücken');disp('(5) Grafik');disp('(6) Programm beenden');disp(' ')
            auswahl= input('Eingabe einer Zahl: ','s');
        case '5'
            %Grafikausgabe
            clc
            axis([-5,5,-5,5])
            plot(x,y)
            hold on
            plot(real(pol), 0, 'go')
            plot(real(null), 0, 'r+')
            %plot(real(pol), 0, 'bo')
            %plot(real(null), 0, 'r+')
            xlabel('X-Achse')
            ylabel('Y-Achse')
            title('Darstellung gebrochenrationaler Funktionen')
            grid on
            pause
            close
            disp('(1) Wertetabelle');disp('(2) Nullstellen');disp('(3) Polstellen');disp('(4) Definitionslücken');disp('(5) Grafik');disp('(6) Programm beenden');disp(' ')
            auswahl= input('Eingabe einer Zahl: ','s');
        case '6'
            auswahl=0;
            clc
        otherwise
            auswahl=0;
            clc
    end
end