function []=startausfu(fktname,x0,datname,gradname,fktzei,xmin,xmax);
% ======================================================================
% Startroutine fuer das Verfahren "Methode der kleinsten Quadrate"
% engl. "method of least squares"
% fuer Beispiele, bei denen eine Ausgleichsfunktion gesucht wird.
%
% Erstellt fuer die Veranstaltung
% Weiterbildenes Studium fuer Ingenieure WS 98/99
%
% Helge Baumann, 13.8.1998
% geaendert S.F.
% ----------------------------------------------------------------------
% Parameter:
%  
% fktname : Name der Funktion F, deren Minimum bestimmt 
%   werden soll. An <fktname> wird ein Spaltenvektor(!) uebergeben. 
%   Achtung! Fuer diese Methode liefert F nicht einen skalaren Ausdruck,
%   sondern einen Vektor . Die Summe der Quadrate dieses Vektors ergibt
%   die Zielfunktion.
% fnamezei : Funktion die gezeichnet werden soll. Wenn nicht angegeben wird
% an fktname 'zei' angehaengt.
% x0 : Spaltenvektor der Dimension n
% gradname : Name der Gradientenfunktion zu fktname.
% datname : Name der Datei mit den Messdaten
% 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
global fnamezei
global datensatz 	%	Der Datensatz wird in fname und gname gebraucht

% Name der Datei mit den Messdaten
if nargin < 4, datname = 'enzym.dat'; end;

load(datname);		% Laden der Daten
%
%	Da der Name der Datei variabel ist, werden die Daten in einer Datei mit
%	veraenderlichem Namen gespeichrt. Die folgenden zwei Zeilen speichern sie
%	in der Matrix werte
% 
matrixname= datname(1:findstr(datname,'.')-1);
datensatz=eval(matrixname);

groesse=size(datensatz);
if groesse(2) ~= 2, error('Der Datensatz hat das falsche Format');end;

% Groesse des Zeichenausschnittes
if nargin <6, xmin = min(datensatz);end;

if nargin <7, xmax = max(datensatz);end;


% Startvektor
if nargin < 2, x0 = ones(4,1) * 0.1; end;

n=size(x0); % n = Dimension des Startvektors/ der Startvektoren

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

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

% Funktion zum Zeichnen
if nargin <5, fktzei=[fktname,'zei'];end;
fnamezei=fktzei;

% Name der Ausgaberoutine
global outputname
outputname = 'ausfuzeichnung';

% Zeichenfarbe
global farbe
farbe = 'r';

% Optionen vorgeben
options = [];
% Genauigkeit einstellen
options(2) = 1e-6;
options(3) = 1e-6;
% Welches Verfahren soll angewendet werden?
% options(5) = 0    : Levenberg-Marquardt
% options(5) = 1    : Gauss-Newton
options(5) = 1;

% Einheitliches Koordinatensystem und Graphikausgabe in ein Fenster
clf;
axis([xmin(1), xmax(1), xmin(2), xmax(2)]);
hold on

% Erlaeuterungen in die Zeichnung einfuegen
title('Methode der kleinsten Quadrate');

% MATLAB-Routine aufrufen  
[lsg,options,wert] = leastsq(fktname,x0,options,gradname);

% Ergebnisse anzeigen
farbe = 'g';
ausfuzeichnung(lsg);
format long
disp('Loesungsvektor')
disp(lsg)
disp('Der Funktionswert im Minimum betraegt')
disp( sum(wert.^2))
disp(sprintf('%s\n%s %d %s', 'Fuer einen Durchlauf dieses Verfahrens',' wurden',options(10),'Funktionsauswertungen benoetigt.'))
disp(sprintf('%s\n%s %d %s', 'Fuer einen Durchlauf dieses Verfahrens',' wurden',options(11),'Gradientenauswertungen benoetigt.'))














