function r = sekante(x1,x2,fnc,small)

% Sekante berechnet die Nullstelle der Function fnc mit Hilfe des
% Sekanten-Verfahrens. Das Anfangsiterierten sind x1, x2. Die Funktion
% muss als m-File bereitgestellt werden.
% Die Iteration wird beendet wenn die Differenz zweier aufeinanderfolgenden
% Iterierten klein ist: |f1-f2| < small
% Beispiel x1=1, x2 =2, fnc='cos', small=1.e-3
% Der Aufruf ist r = sekante(x1,x2,fnc,small)

%=================================================================
 if isstr(fnc)~=1;
   error('fnc muss ein String sein');
 end
%=================================================================
 if (norm(x1-x2)<1e-10) 
   error('Die Anfangsiterierten sind zu dicht beieinander.');
 end

 x = x2;  		 
 dx = 2*small;        
 i = 0;
 fx1 = feval(fnc,x1);
 x(1) = x1;
 f(1) = fx1;
 
% Die Iteration.
 while norm(dx) > small;
   i = i + 1;
   if i>50; 
     error('zu viele Iterationen (iter = %d)',i-1);
   end
   fx2 = feval(fnc,x2);  
   dx = (x2-x1)/(fx2-fx1)*fx2;
   x(i+1) = x2;
   x1 = x2;
   fx1 = fx2;
   x2 = x2 - dx;
   f(i+1) = fx2; 
   s = sprintf('Iteration %d Iterierte %g Funktionswert %g',...
               i, x2, feval(fnc,x2));
   disp(s);
 end

r = x2;
x(i+2) = r;
f(i+2) = feval(fnc,r);
ite = i+2;
s = sprintf('Nullstelle %g',r);  
disp(s);

% 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
    xa(i+1) = start + i*length;
    y(i+1) = feval(fnc,xa(i+1));
    z(i+1) = 0;
  end 
  plot(xa,y,'-b',xa,z,':r');
end

hold on

% zeichne die Iterierten
for j=1:ite
  if (x(j) >=start) && (x(j) <= start+2*interval)
    plot(x(j),f(j),'ok');
    pause(1) 
    hold on
  end 
end





