/* FILE: lm.c * PURPOSE: Do Levenberg-Marquardt minimization. * AUTHOR: Kenneth J. Mighell (mighell@noao.edu) * LANGUAGE: ANSI C * DATE: 2001SEP10 * COPYRIGHT: (C) 2001 Assoc. of Universities for Research in Astronomy Inc. */ #include "mx.h" #include "inc.h" #define DEBUGT (MX_TRUE) #define DEBUGF (MX_FALSE) #define DEBUG (DEBUGT) #define OFFSET(j,k) (j+(k*MXNPARL)) int LevenbergMarquardt_i16( long nptsl, /* number of data points */ double xd[], /* X coordinate vector */ double yd[], /* Y coordinate vector */ double zd[], /* Z measurement vector */ double zerrd[], /* Z error vector */ double md[], /* Z model vector */ double wd[], /* work vector */ long nparl, /* number of parameters */ double ad_p[], /* parameter vector */ double aerrd[], /* parameter error vector */ char ausec[], /* a string of nparl characters either "f" or "c" */ double diffmnd, /* stop fitting when (old_chisqd-chisqd)<=diffmnd */ double *chisqd_p, /* chi-square */ long *ndfl_p, /* number of degrees of freedom */ int *mfiti_p, /* number of free parameters */ double *lambdad_p /* Levenberg-Marquart method lambda */ ){ char funcnamec[] = "LevenbergMarquardt_i16.c"; double chisqd = *chisqd_p, lambdad = *lambdad_p, ad[MXNPARL], alphad[MXNPARL*MXNPARL], covard[MXNPARL*MXNPARL], betad[MXNPARL], deltad[MXNPARL], delad[MXNPARL], detd, old_chisqd, diffd, tmpd; long ndfl; /* number of degrees of freedom */ int mfiti, /* number of free parameters <= nparl <= MXNPARL */ ausei[MXNPARL], amapi[MXNPARL], i, j, k, index, ii, jj, kk; int status; const double multiplier_lambdad = 10.0; /* see Marquardt (1963) */ status = 1; if ( strlen(ausec) != nparl ) { sprintf (MX.tmpmsg, "\a*** ERROR *** " "strlen(\"%s\") != (nparl=%ld)\n", ausec, nparl); goto error; } mfiti = 0; for (j=0; j