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

% regula_falsi berechnet die Nullstelle der Function fnc mit Hilfe der
% Regula falsi. 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=-10, x2 =10, fnc='poly3_fnc', small=1.e-7
% Der Aufruf ist r = demo_regula_falsi(x1,x2,fnc,small)

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

fx1 = feval(fnc,x1);
fx2 = feval(fnc,x2);

interval = abs(x1-x2); 
start = min(x1,x2);
 
if fx1==0.0
  s = sprintf('Nullstelle %g',x1);  
  disp(s);
  r = x1;
  return
end
if fx2==0.0
  s = sprintf('Nullstelle %g',x2);  
  disp(s);
  r = x2;
  return
end

if fx1*fx2>0
  error('Die Funktionswerte an den gegebenen Stellen haben dasselbe Vorzeichen')
end 

  
 if fx1 < 0
   xminus = x1;
   fminus = fx1;
   xplus = x2;
   fplus = fx2;
 else
   xplus = x1;
   fplus = fx1;
   xminus = x2;
   fminus = fx2;
 end
  
 x = x2;  		 
 dx = abs(x1-x2);        
 i = 0;
 x(1) = x1;
 f(1) = fx1;
 x(2) = x2;
 f(2) = fx2;
 
 % Die Iteration.
 while norm(dx) > small;
   i = i + 1;
   if i>1000; 
     error('zu viele Iterationen (iter = %d)',i-1);
   end
   fx2 = feval(fnc,x2);        % Funktionswert der neuen Iterierten

   if fx2==0                   % Nullstelle gefunden                   
     s = sprintf('Nullstelle %g',x2);  
     disp(s);
     r = x2;
     return
   end

   if fx2 < 0         % finde letzte Iterierte mit anderem Vorzeichen          
     x1 = xplus;     % aktualisiere letzte Iterierte mit gleichem Vorzeichen
     fx1 = fplus;
     xminus = x2;
     fminus = fx2;
   else
     x1 = xminus;
     fx1 = fminus;
     xplus = x2;
     fplus = fx2; 
   end

   dx = (x2-x1)/(fx2-fx1)*fx2;
   x(i+1) = x2;
   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;
  length = interval/steps;
  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

if f(1) < 0
  xminus = x(1); 
  fminus = f(1);
  xplus = x(2);
  fplus = f(2);
else
  xplus = x(1); 
  fplus = f(1);
  xminus = x(2);
  fminus = f(2);
end
 
% zeichne die Iterierten
for j=1:ite
  plot(x(j),f(j),'ok');
  % plot sekante
  if j>1
    if f(j) > 0  
      vx = [xminus,x(j)];
      vy = [fminus,f(j)];
      xplus = x(j);
      fplus = f(j);
    else
      vx = [xplus,x(j)];
      vy = [fplus,f(j)];
      xminus = x(j);
      fminus = f(j);
    end  
    sekante  = line(vx,vy);
    set(sekante,'linestyle',':')
  end

  pause() 
  hold on 
end





