function r = demo_bisektion(a,b,fnc,small)

% Bisektion berechnet die Nullstelle der Function fnc mit Hilfe des
% Bisektions-Verfahrens. Das Anfangsintervall ist [a,b]. Die Funktion
% muss als m-File bereitgestellt werden.
% Die Iteration wird beendet wenn die Intervalll"ange klein genug ist:
% |b^k-a^k| < small
% Beispiel a = -10, b = 10, fnc='poly3_fnc', small=1.e-7.
% Der Aufruf ist r = demo_bisektion(a,b,fnc,small)

%=================================================================
 if isstr(fnc)~=1;
   error('fnc muss ein String sein');
 end
%=================================================================

if b<a
  tmp = b;
  b = a;
  a = tmp;
end 
fa = feval(fnc,a);
fb = feval(fnc,b);

xx(1) = a;
fx(1) = feval(fnc,xx(1));
xx(2) = b;
fx(2) = feval(fnc,xx(2));
start = a;
if (b<a)
   start = b;
end   
interval = abs(b-a);
clf

if fa==0.0
  s = sprintf('Nullstelle %g',a);  
  disp(s);
  r = a;
  return
end
if fb==0.0
  s = sprintf('Nullstelle %g',b);  
  disp(s);
  r = b;
  return
end

if fa*fb>0
  error('Die Funktionswerte an den Intervallgrenzen haben dasselbe Vorzeichen')
end

i = 0;
% Die Iteration.
 while norm(b-a) > small;
   i = i + 1;
   if i>200; 
     error('zu viele Iterationen (iter = %d)',i-1);
   end
   x = (b+a)/2.0;
   fa = feval(fnc,a);
   fb = feval(fnc,b);
   fx = feval(fnc,x);
   if fx==0.0
     s = sprintf('Nullstelle %g',x);  
     disp(s);
     r = x;
   return
   end
   if fb*fx < 0
     a = x;
   else
     b = x;
   end
   s = sprintf('Iteration %d Intevall [%g,%g]',...
               i, a, b);  
   disp(s);
   
   xx(i+2) = x;
   fx(i+2) = feval(fnc,xx(i+2));
 end

ite = i;
r = (a+b)/2;
s = sprintf('Nullstelle %g',r);  
disp(s);

% zeichne Bild der Funktion 

 if imag(r)==0
   steps = 1000;
   length = interval/steps;
   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');
 end
 hold on;

for i=1:ite
   plot(xx(i),fx(i),'ok');
   pause()
   hold on
end





