function [alpha] = wolf(phi0,g,rho,sigma,beta)
% ======================================================================
% Funktion, dient zur Schrittlaengenbestimmung nach Wolf-Powell
% es werden folgende Angaben benötigt
global fname;     %   Name der zu ninimierenden Funktion 
global gname;     %   Name des Gradienten
global xaktuell;  %   Punkt 
global s;	  %   Suchrichtung
%      g          %   Gradient
%      rho        %   Parameter  0< rho < 0.5
%      beta       %   Parameter beta>0, fuer Newton-Verfahren beta=1 gut.
% ======================================================================
% Rueckgabeparameter:
% alpha :Schrittlänge
% ---------------------------------------------------------------------
% Programmvariablen:
% f : Wert der Funktion fname an der Stelle x.
% g : Wert des Gradienten von fname an der Stelle x.
% normf, normg : Die Norm von f bzw. g.
% xalt,falt : Die Werte von x bzw. f im vorherigen Schritt.
% xaktuell: Der aktuelle x-Wert wird in dieser Variable nochmal gespeichert.
%     x wird bereits als Parameter uebergeben und sollte deshalb nicht global sein.
%     xaktuell ist global und kann deshalb in phi.m ausgelesen werden.
% alpha : Schrittlaenge
% s : Suchrichtung
% rho : Parameter zur Schrittlaengenbestimmung, 0< rho < 0.5
% epsilon : Abbruchgenauigkeit
% iterationmax : Anzahl der maximalen Iterationen
% abbruch, tf,tf2,tf3  :  Hilfsvariable
% ======================================================================
global nfc; 
global ngc; 

% Initialisierung

if nargin < 5, alpha=1; end;
if nargin <4 , rho = 0.1; end;
if nargin <3 , sigma = 0.1; end;
if nargin <2 , g=-s; end; % steilster Abstieg
if nargin <1 , phi0=phi(0);end;

  phistrich0 = g' * s;

  % Logische Variable fuer Abbruchbedingung
  alphagefunden = 0;
  
        % Wolfe Powell Schrittlaengenbestimmung Schritt (ii) 
   while (~(alphagefunden) & (phi(alpha) < phi0+rho*alpha*phistrich0 ))
		x = xaktuell + alpha * s;      
      if feval(gname,x)' * s >= sigma * phistrich0
         alphagefunden = 1;
      else
         alpha = 2*alpha;
      end;
   end;  % end of while
   a = 0; b = alpha;
   %
	% Wolfe Powell Schrittlaengenbestimmung Schritt (iii) 
   while ~(alphagefunden)
      alpha = (a+b) / 2;
      if phi(alpha) >= (phi0 + rho*alpha*phistrich0)
         b = alpha;
      else
         x = xaktuell + alpha * s;
    	  if feval(gname,x)' * s >= sigma * phistrich0
             alphagefunden = 1;
          else
             a = alpha;
         end;
      end; 
   end; % end of while
   
  % in alpha steht nun eine Schrittlaenge, 
  % die den Wolfe-Powell-Bedingungen genuegt.
return;






