You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
85 lines
3.3 KiB
85 lines
3.3 KiB
/* |
|
* Project: LevenbergMarquardtLeastSquaresFitting |
|
* |
|
* File: lmmin.h |
|
*/ |
|
|
|
#ifndef LMMIN_H |
|
#define LMMIN_H |
|
|
|
|
|
/** Compact high-level interface. **/ |
|
|
|
/* Collection of control (input) parameters. */ |
|
typedef struct { |
|
double ftol; /* relative error desired in the sum of squares. */ |
|
double xtol; /* relative error between last two approximations. */ |
|
double gtol; /* orthogonality desired between fvec and its derivs. */ |
|
double epsilon; /* step used to calculate the jacobian, or 0 for user provided jacobian. */ |
|
double stepbound; /* initial bound to steps in the outer loop. */ |
|
int maxcall; /* maximum number of iterations. */ |
|
int scale_diag; /* UNDOCUMENTED, TESTWISE automatic diag rescaling? */ |
|
#ifdef LMFIT_PRINTOUT |
|
int printflags; /* OR'ed to produce more noise */ |
|
#endif |
|
} lm_control_struct; |
|
|
|
/* Collection of status (output) parameters. */ |
|
typedef struct { |
|
double fnorm; /* norm of the residue vector fvec. */ |
|
int nfev; /* actual number of iterations. */ |
|
int info; /* status (index for lm_infmsg and lm_shortmsg). */ |
|
} lm_status_struct; |
|
|
|
/* Recommended control parameter settings. */ |
|
extern const lm_control_struct lm_control_double; |
|
extern const lm_control_struct lm_control_float; |
|
|
|
#ifdef LMFIT_PRINTOUT |
|
/* Standard monitoring routine. */ |
|
void lm_printout_std( int n_par, const double *par, int m_dat, |
|
const void *data, const double *fvec, |
|
int printflags, int iflag, int iter, int nfev ); |
|
#endif |
|
|
|
/* Refined calculation of Eucledian norm, typically used in printout routine. */ |
|
double lm_enorm( int, const double * ); |
|
|
|
/* The actual minimization. */ |
|
void lmmin( int n_par, double *par, int m_dat, const void *data, |
|
void (*evaluate) (const double *par, int m_dat, const void *data, |
|
double *fvec, double *fjac, int *info), |
|
const lm_control_struct *control, lm_status_struct *status |
|
#ifdef LMFIT_PRINTOUT |
|
, void (*printout) (int n_par, const double *par, int m_dat, |
|
const void *data, const double *fvec, |
|
int printflags, int iflag, int iter, int nfev) = NULL |
|
#endif |
|
); |
|
|
|
|
|
/** Legacy low-level interface. **/ |
|
|
|
/* Alternative to lm_minimize, allowing full control, and read-out |
|
of auxiliary arrays. For usage, see implementation of lmmin. */ |
|
void lm_lmdif( int m, int n, double *x, double *fvec, double ftol, |
|
double xtol, double gtol, int maxfev, double epsfcn, |
|
double *diag, int mode, double factor, int& info, int& nfev, |
|
double *fjac, int *ipvt, double *qtf, double *wa1, |
|
double *wa2, double *wa3, double *wa4, |
|
void (*evaluate) (const double *par, int m_dat, const void *data, |
|
double *fvec, double *fjac, int *info), |
|
const void *data |
|
#ifdef LMFIT_PRINTOUT |
|
, void (*printout) (int n_par, const double *par, int m_dat, |
|
const void *data, const double *fvec, |
|
int printflags, int iflag, int iter, int nfev), |
|
int printflags |
|
#endif |
|
); |
|
|
|
extern const char *lm_infmsg[]; |
|
extern const char *lm_shortmsg[]; |
|
|
|
|
|
#endif /* LMMIN_H */
|
|
|