function []=startab(fktname,x0,gradname,iterationmax,nlines);
% ======================================================================
% Startroutine fuer das Verfahren des steilsten Abstieges..
%
% Erstellt fuer die Veranstaltung
% Weiterbildenes Studium fuer Ingenieure WS 98/99
%
% Helge Baumann, 17.8.1998
% ----------------------------------------------------------------------
% Aurufparameter:
%  
% fktname : Name der Funktion F, deren Minimum bestimmt 
%   werden soll. An <fktname> wird ein Spaltenwektor(!) uebergeben. 
%   F ist eine Funktion von R^n -> R. Standard : 'testfunktion'
% x0 : Spaltenvektor der Dimension n. Standard: [-2; 2]
% gradname : Name der Gradientenfunktion zu fktname.
% iterationmax : Anzahl der maximalen Iterationen. Standard: 100
% nlines : Anzahl der zu zeichnenden Hoehenlinien. Standard: 40
%% Initialisierung 

% xmin haelt fuer jede Dimension die kleinste waehrend der Iteration
%      auftretende Zahl fest.
% xmax haelt fuer jede Dimension die groeste waehrend der Iteration
%      auftretende Zahl fest.
% xmin und xmax werden benoetigt um den richtigen Bildschirmausschnitt
% bei der Darstellung des Iterationsverlaufes anzuzeigen.
global xmin
global xmax

% Anzahl der Funktionsauswertungen
global nfc; nfc = 0;
global verfahren; verfahren = 'wolf';

% Anzahl der Hoehenlinien
if nargin < 5, nlines = 40; end;

% Anzahl der maximalen Iterationen
if nargin < 4, iterationmax = 1000; end;

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

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

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

% Name der Ausgaberoutine
outputname = '';

% Konstanten
xpoints = 21;   % Anzahl der Gitterpunkte in x Richtung fuer contour-plot
ypoints = 21;   % Anzahl der Gitterpunkte in y Richtung fuer contour-plot

% Im Fall n==2 kann eine graphische Ausgabe erfolgen. Dafuer sind einige
% Vorarbeiten noetig, die fuer die eigentliche Minimierung keine Rolle
% spielen. Der gesamte 'if'-Block dient ausschliesslich diesen Vorbereitungen.
if n==2
   % Benutzermitteilung
   disp(sprintf('%s\n%s','Die Parameter fuer die graphische Ausgabe werden nun berechnet.',...
      'Bitte haben Sie einen Moment Geduld.'));
   % Fuer xmin (xmax) werden die groestmoeglichen (kleinstmoeglichen) Zahlen
   % vorgegeben. Dient nur dazu einen Vektor in entsprechender
   % Groesse bereitzustellen.
   xmin = ones(n,1)*realmax;
   xmax = -ones(n,1)*realmax;

   outputname = 'minmax';
   % Der erste Durchlauf ist nur zur Bestimmung von xmin und xmax gedacht.
   [lsg,wert,iterationen,nfc] = ...
       steilsterabstieg(fktname,x0,gradname,iterationmax,outputname);

   if iterationen == 0, return; end;
   nfc = 0;
   
   % Beobachtungsfenster festlegen, um 10% groesser als ermittelte Werte.
   xlaenge = (xmax-xmin)/2; xmitte = (xmax+xmin)/2;
   xmin = xmitte -(xlaenge* 1.1);
   xmax = xmitte + (xlaenge*1.1);

   % Einheitliches Koordinatensystem und Graphikausgabe in ein Fenster
   clf;
   axis([xmin(1), xmax(1), xmin(2), xmax(2)]);
   hold on
      
   %% Hoehenlinien einzeichnen
   % Gitter erzeugen; zu den Knoten wird der Funktionswert ermittelt.
   xrange = xmin(1):(xmax(1)-xmin(1))/(xpoints-1):xmax(1);
   yrange = xmin(2):(xmax(2)-xmin(2))/(ypoints-1):xmax(2);
   [xgitter,ygitter] = meshgrid(xrange,yrange);
   for i=1:xpoints
      [zgitter(i,1:ypoints)] = ...
	  feval(fktname,[xrange(i)*ones(1,ypoints);yrange(1:ypoints)]);     
   end 
   nfc = 0;
   
   % Erzeugzung der Hoehenlinien
   contour(xgitter,ygitter,zgitter',nlines);
   
   % Erlaeuterungen in die Zeichnung einfuegen
   title('Modellalgorithmus mit Richtung des steilsten Abstieges');
   % nur wenn ein Minimum gefunden wurde, wird es eingezeichnet
   if iterationen < iterationmax 
      plot(lsg(1),lsg(2),'g*');	% Minimum einzeichnen
      legend('berechnetes Minimum');
   end
   
   % Handle fuer das Polyeder erzeugen.
   outputname = 'zeichnung'; % Name der Ausgaberoutine

   % fuer die Zeichenroutine
   global letzterx; letzterx = x0;

end

% Der Durchlauf, bei dem in jedem Iterationsschritt eine Ausgabe
% erfolgen kann.
[lsg,wert,iterationen,nfc,ngc] = ...
   steilsterabstieg(fktname,x0,gradname,iterationmax,outputname);

if n==2, hold off; end;


% Ergebnisse anzeigen
disp('Loesungsvektor')
disp(lsg)
disp('Der Funktionswert im Minimum betraegt')
disp(wert)
disp(sprintf('\nAnzahl der Iterationen: %d',iterationen ))
disp(sprintf('%s\n%s %d %s', 'Fuer einen Durchlauf dieses Abstiegs-Verfahrens',' wurden',nfc,'Funktionsauswertungen benoetigt.'))
disp(sprintf('%s\n%s %d %s', 'Fuer einen Durchlauf dieses Abstiegs-Verfahrens',' wurden',ngc,'Gradientenauswertungen benoetigt.'))
if iterationen>=iterationmax
	disp('ACHTUNG!!! Maximale Anzahl der Iterationen erreicht!')
end
