function [alpha] = gold(phi0,g,rho,beta)
% ======================================================================
% Funktion, dient zur Schrittlaengenbestimmung nach Goldstein
% es werden folgende Angaben benötigt
global fname;     %   Name der zu ninimierenden Funktion 
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 < 4, beta=1; end;
if nargin <3 , rho = 0.1; end;
if nargin <2 , g=-s; end; % steilster Abstieg
if nargin <1 , phi0=phi(0);end;

  % Bestimmung der Schrittlaenge alpha:
  % Schrittlaengenstrategie nach Goldstein:
  phistrich0 = g' * s;
  alpha=0;

  while (phi(beta) < phi0+(1-rho)*beta*phistrich0 )
    alpha = beta; beta = 2*beta;
  end;
  if phi(beta) > phi0 + rho*beta*phistrich0
    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 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.
return;






