function r = newton_horner(x,fnc,small)

% Newton berechnet die Nullstelle des Polynoms fnc mit Hilfe des
% Newton-Verfahrens und des Horner-Schemas. 
% Die Anfangsiterierte is x. Die Berechnung der Funktionswerte des
% Polynoms und seiner Ableitung muss als m-File bereitgestellt werden.
% Die Iteration wird beendet wenn die Differenz zweier aufeinanderfolgenden
% Iterierten klein ist: |f1-f2| < small
% Beispiel fnc='poly4_horner', small=1.e-3.
% Der Aufruf ist r = newton_horner(x,fnc,small)

%=================================================================
 if isstr(fnc)~=1 ;
   error('fnc muss ein String sein');
 end
%=================================================================
 r = x;  		 
 dx = 2*small;        
 i = 0;
 xx(1) = x;
 [fx(1),tmp] = feval(fnc,xx(1)); % tmp ist eine Dummy-Variable

% Die Iteration.
 while norm(dx) > small;
   i = i + 1;
   if i>20; 
     error('zu viele Iterationen (iter = %d)',i-1);
   end
   [f,df] = feval(fnc,r);                              % Ableitung %
   if abs(df)<small; 
     error('Ableitung zu klein, Method divergiert');
   end
   dx = -f/df;                           % Newton Korrektur %
   r = r + dx;                                      % neue Iterierte %
   if imag(r)==0
     s = sprintf('Iteration %d Iterierte %g Funktionswert %g',...
               i, r, feval(fnc,r));
   else
    t = feval(fnc,r);
    s = sprintf('Iteration %d Iterierte %g + i * %g Funktionswert %g + i * %g',...
               i, real(r), imag(r), real(t), imag(t));
   end  
   disp(s);
   xx(i+1) = r;
   [fx(i+1),tmp] = feval(fnc,xx(i+1));
 end
 ite = i+1;

% zeichne Bild der Funktion
 close all

 if imag(r)==0
   steps = 1000;
   interval = 1.0;
   length = 2*interval/steps;
   start = r - interval;
   for i=0:steps
     x(i+1) = start + i*length;
     y(i+1) = feval(fnc,x(i+1));
     z(i+1) = 0;
   end
 
   plot(x,y,'-b',x,z,':r');


   hold on

% zeichne die Iterierten
  for j=1:ite
    plot(xx(j),fx(j),'ok');
    pause(2) 
    hold on 
  end

end % if imag(r)==0








