function [alpha] = goldzei(fktname,x,gname,rho,beta)
% ======================================================================
% Funktion, dient zur Schrittlaengenbestimmung nach Goldstein
% es werden folgende Angaben benötigt
global fname;     %   Name der zu nimimierende Funktion 
global xaktuell;  %   Punkt 
%      gname      %   Name des Gradienten der zu minimierenden Funktion
%      rho        %   Parameter  0< rho < 0.5
global s;	  %   Suchrichtung
% ======================================================================

% Anzahl der Funktionsauswertungen
global nfc 
nfc = 0;

% Parameter beta
if nargin < 5, beta = 1 ; end

% Parameter rho
if nargin < 4, rho = 0.1 ; end

% Name der Gradientenfunktion zu fktname
if nargin < 3, gname = 'gradienttestfunktion'; end;

% Startvektor
if nargin < 2, x = [1; 0.01]; end
[n,m] = size(xaktuell); % n = Dimension des Startvektors/ der Startvektoren

% Name der zu minimierenden Funktion
if nargin < 1, fktname = 'testfunktion'; end

if (nargin < 3) & (nargin>0)
    l1=length(fktname);
    l2=length('testfunktion');
    testname='testfunktion';
    if (l1~=l2) | (fktname(1:min(l1,l2))~=testname(1:min(l1,l2)))
	['Warscheinlich fahlerhafte Eingabe. Die Funktion ist ',fktname,'.m.',...
	'Hat sie den Gradienten ',gname,'.m?']
end;
end;

xaktuell=x;
fname=fktname;

[g] = feval(gname,x);
[f] = feval(fname,x);

s=-g;% Suchrichtung Richtung des steilsten Abstiegs 

  % Bestimmung der Schrittlaenge alpha:
  % Schrittlaengenstrategie nach Goldstein:
  alpha = 0;

  phi0 = phi(0); phistrich0 = g' * s;

% Die folgenden Zeilen sind nur zum Zeichnen notwendig
% Bestimmung von b mit phi(b)>phi2(b), phi(a)<phi2(a) fuer a=b/2.
figure(1)	%	enthaelt die Funktion mit erkennbarem Minimum
cla reset
a=1;
while phi(a) < phi0
   a=a*2;
end;
   b=a;
while phi(a) > phi0
   a=0.5*a;
end;
   c=(a+b)/2;
while (phi(c)>1.001*phi0) | (phi(c)<phi0)
   if phi(c)>phi0
      b=c;
   else
      a=c;
   end;
   c=(a+b)/2;
end;
% Es wird die Funktion phi im Intervall [0,c] gezeichnet
  a_aus=linspace(0,c,300);
  p_aus=[];
  for i=1:300
    p_aus=[p_aus,phi(a_aus(i))];
  end;
  plot(a_aus,p_aus,'-','Erasemode','none');
hold on
% das Minimum in [0,c]
  d=fmin('phi',0,c); 
  pd=phi(d);
  plot(d,pd,'*','Erasemode','none');
% die Funktion phi1 
  e=(pd-phi0)/(1-rho)/phistrich0; % ansonsten wird zuviel von phi1 gezeichnet
  p1_aus=[phi0,phi0+e*(1-rho)*phistrich0];
  plot([0,e],p1_aus,'r','Erasemode','none');
% die Funktion phi2
  f=min((pd-phi0)/(rho)/phistrich0,c); % ansonsten wird zuviel von phi2 gezeichnet
  p2_aus=[phi0,phi0+f*rho*phistrich0];
  plot([0,f],p2_aus,'r','Erasemode','none');
  if beta>c
    title('Ausschnitt')
    xlabel('vgl. Figure No. 2')
  else 
   title('alle Iterierten')
   xlabel('')
  end;
if beta >c
  figure(2)
cla reset
  a_aus=linspace(0,max(beta,d),300);
  p_aus=[];
  for i=1:300
    p_aus=[p_aus,phi(a_aus(i))];
  end;
  plot(a_aus,p_aus,'-','Erasemode','none');
  hold on
  plot(d,pd,'*','Erasemode','none')
% die Funktion phi2:
  plot([0,f],p2_aus,'r','Erasemode','none');
% die Funktion phi1 
  plot([0,e],p1_aus,'r','Erasemode','none');
  xlabel('Figure No.  1 enthaelt Ausschnitt');
end;
%------------------------------------------------------------------------
% Funktion wurde gezeichnet, weiter mit Goldstein.
%------------------------------------------------------------------------
nfc=1; % eine Funktionauswertung, wurde fuer die Berechnung von phi0 gebraucht.
   
  while (phi(beta) < phi0+(1-rho)*beta*phistrich0 )
    alpha = beta; beta = 2*beta;
    if beta >c
       figure(2)
       plot(beta,phi(beta),'r+','Erasemode','none'); nfc=nfc-1;
    else
       figure(1)
       plot(beta,phi(beta),'r+','Erasemode','none'); nfc=nfc-1;
    end;
  end;
  if phi(beta) > phi0 + rho*beta*phistrich0
    if beta >c
       figure(2)
       plot(beta,phi(beta),'r+','Erasemode','none'); nfc=nfc-1;
    else
       figure(1)
       plot(beta,phi(beta),'r+','Erasemode','none'); nfc=nfc-1;
    end;
    gamma = 0;           % damit in nachfolgender Schleife nicht vor dem 
    phigamma =  phi0+1;   % ersten Durchlauf abgebrochen wird.
    while ( (phigamma < phi0 + (1-rho)*gamma*phistrich0) | ...
            (phigamma > phi0 + rho*gamma*phistrich0 ))
	gamma = (alpha+beta) / 2;
	phigamma = phi(gamma);
        if gamma >c
           figure(2)
           plot(gamma,phi(gamma),'k+','Erasemode','none'); nfc=nfc-1;
        else
           figure(1)
           plot(gamma,phi(gamma),'k+','Erasemode','none'); nfc=nfc-1;
        end;
	if phigamma < phi0 + (1-rho)*gamma * phistrich0, alpha=gamma; end;
	if phigamma > phi0 + rho * gamma * phistrich0, beta = gamma; end;
    end;     % end of while
    alpha = gamma;
  else
    alpha = beta;
  end;
  % in alpha steht nun eine Schrittlaenge, 
  % die den Goldsteinbedingungen genuegt.
figure(1)
plot(alpha,phi(alpha),'gx','Erasemode','none');nfc=nfc-1;
hold off 
if beta >c
figure(2)
plot(alpha,phi(alpha),'gx','Erasemode','none');nfc=nfc-1;
hold off;
end;



