%
%  Erstellen Sie die Funktion polynom, die eine Kurvendiskussion für Polynome 
%    vom beliebigen Grad durchführt, in Anlehnung an die Funktion in kurvendisk.m.
%
%  Als erstes fragt die Funktion den Anwender nach dem Grad des Polynoms, 
%  dann nach den Werten der einzelnen Koeffizienten 
%  [Anzahl = grad +1: a(n), ..., a(1), a(0) ].
%  Mit diesen Daten werden die Nullstellen und die Extrema des Polynoms berechnet 
%  und ausgegeben. Zum Schluss wird das Polynom für ein gewünschtes Intervall gezeichnet. 
%  In der Grafik werden auch die Nullstellen und Extrema markiert.
%  Achten Sie darauf, dass nur reelle Nullstellen wirkliche Nullstellen 
%  der Funktion sind. Sie müssen deshalb mit der Funktion isreal die 
%  zurückgegebenen Nullstellen testen.
%
function polynom()

    fprintf( 'Kurvendiskussion für ein Polynom: \n' );
    grad = input( '- Grad: ' );

    fprintf( 'mit folgenden Koeffizienten a(n): \n' );
    for( n = grad:-1:0 );
       fprintf( '- a(%d) = ', n );
       pol( grad-n+1 ) = input( '' );  % n+1, da bis n=0
    end
    
    % Nullstellen
    nullst = roots( pol ) 
    anzNSt = length( nullst );
    
    % 1. Ableitung
    d1 = polyder( pol ); 
    
    % Extrema
    extr = roots( d1 ) 
    anzExtr = length( extr );
    valExtr = polyval( pol, extr );
    
    % 2. Ableitung
    d2 = polyder( d1 ); 
    
    % Wendepunkte
    wendep = roots( d2 ); 
    anzWP = length( wendep )
    valWP = polyval( pol, wendep );

    xDef = input( 'x-Intervall [x1,x2] : ' );

    x = [ xDef(1) : 0.1 : xDef(2) ];
    y = polyval( pol, x );
    
    hold on
    
    plot(x,y);
    y0 = y;
    y0( : ) = 0;
    plot(x,y0, 'k:' );
    
    for( n=1:anzNSt ) 
        if( isreal( nullst(n) ) == 1 ) 
          nst = nullst(n);  
          plot( nullst(n), 0, 'o' ) 
        end
    end
    for( n=1:anzExtr )
        if( isreal( extr(n) ) == 1 ) 
          plot( extr(n), valExtr(n), '*' ) 
        end
    end
    for( n=1:anzWP )
        if( isreal( wendep(n) ) == 1 ) 
          plot( wendep(n), valWP(n), 'd' ) 
        end
    end
    
    hold off
    
end
