function [a,alpha_mrq,covar,beta_mrq,chisq,ochisq,alamda,vmar] = mrqmin(funcs,x,y,sig,ndata,ma,a,alamda,alpha_mrq,beta_mrq,ochisq);

% Diese Funktion fuehrt einen Iterationsschritt im Rahmen des Gauss-Newton-
% Marquardt-Verfahrens nach dem Skriptum, Abschnitt 4.5.5 durch.

% BESCHREIBUNG DER PARAMETER siehe Skriptum
% Es ist zu beachten, dass in dieser Version die Funktion übergeben
% wir und die Übergabeparameter alpha, beta und
% ochisq sowohl Input als auch Outputparameter sind.

% Dieses Programm ruft die folgende Routine  mrqcof  auf. Diese Routine arbeitet
% genau wie im Skriptum (S. 125f) beschrieben.

% Die Routine  mrqcof  ruft ihrerseits die Routine  funcs  auf:
%
%  [ymod,dyda] = funcs(x,a,ma,ndata);
%  Eingabe-Parameter:  wie oben
%  Ausgabe-Parameter:  ymod    Zeilenvektor mit den ndata Werten der Modellfunktion
%                      dyda    Matrix (1. Index=Nummer des Parameters,
%                                      2. Index=Nummer des Datenpunktes) mit den partiellen
%                              Ableitungen der Modellfunktion nach den Modellparametern

%  DIESE FUNKTION MUSS VON BENUTZER DES MRQMIN-PROGRAMMS BEIGESTELLT WERDEN.

warning('off','all')
if alamda<0.0
  alamda=0.0003;
  [alpha_mrq,beta_mrq,chisq] = mrqcof(funcs,x,y,sig,ndata,ma,a);
  ochisq=chisq;
  fprintf('%3i  %12.6e    ',0,chisq);
  for j=1:ma
    fprintf('   %12.6e',a(j));
  end
  fprintf('\n');
end

normal=alpha_mrq.*(1+eye(ma)*alamda);

if alamda==0.0
  covar=inv(normal);
  chisq=ochisq;
  vmar=false;
else
  covar=[];
  da=(normal\beta_mrq')';
  atry=a+da;
  [normal,vektor,chisq] = mrqcof(funcs,x,y,sig,ndata,ma,atry);
  if chisq<=ochisq
    alamda=alamda/5.0;
    ochisq=chisq;
    vmar=false;
    alpha_mrq=normal;
    beta_mrq=vektor;
    a=atry;
  else
    alamda=alamda*5.0;
    vmar=true;
  end
end
warning('on','all')