38 #define LM_MACHEP DBL_EPSILON
39 #define LM_DWARF DBL_MIN
40 #define LM_SQRT_DWARF sqrt(DBL_MIN)
41 #define LM_SQRT_GIANT sqrt(DBL_MAX)
42 #define LM_USERTOL 30 * LM_MACHEP
65 const char *
lm_infmsg[] = {
"success (sum of squares below underflow limit)",
66 "success (the relative error in the sum of squares is at most tol)",
67 "success (the relative error between x and the solution is at most tol)",
68 "success (both errors are at most tol)",
69 "trapped by degeneracy (fvec is orthogonal to the columns of the jacobian)",
70 "timeout (number of calls to fcn has reached maxcall*(n+1))",
71 "failure (ftol<tol: cannot reduce sum of squares any further)",
72 "failure (xtol<tol: cannot improve approximate solution any further)",
73 "failure (gtol<tol: cannot improve approximate solution any further)",
74 "exception (not enough memory)",
75 "fatal coding error (improper input parameters)",
76 "exception (break requested within function evaluation)"};
78 const char *
lm_shortmsg[] = {
"success (0)",
"success (f)",
"success (p)",
"success (f,p)",
79 "degenerate",
"call limit",
"failed (f)",
"failed (p)",
80 "failed (o)",
"no memory",
"invalid input",
"user break"};
86 void lm_printout_std(
int n_par,
const double *par,
int m_dat,
const void *data,
const double *fvec,
int printflags,
87 int iflag,
int iter,
int nfev)
101 if (printflags & 1) {
104 printf(
"trying step in gradient direction ");
105 }
else if (iflag == 1) {
106 printf(
"determining gradient (iteration %2d)", iter);
107 }
else if (iflag == 0) {
108 printf(
"starting minimization ");
109 }
else if (iflag == -1) {
110 printf(
"terminated after %3d evaluations ", nfev);
114 if (printflags & 2) {
116 for (i = 0; i < n_par; ++i)
117 printf(
" %18.11g", par[i]);
118 printf(
" => norm: %18.11g",
lm_enorm(m_dat, fvec));
124 if ((printflags & 8) || ((printflags & 4) && iflag == -1)) {
125 printf(
" residuals:\n");
126 for (i = 0; i < m_dat; ++i)
127 printf(
" fvec[%2d]=%12g\n", i, fvec[i]);
135 void lmmin(
int n_par,
double *par,
int m_dat,
const void *data,
136 void (*evaluate)(
const double *par,
int m_dat,
const void *data,
double *fvec,
int *info),
138 void (*printout)(
int n_par,
const double *par,
int m_dat,
const void *data,
const double *fvec,
139 int printflags,
int iflag,
int iter,
int nfev))
144 double *fvec, *diag, *fjac, *qtf, *wa1, *wa2, *wa3, *wa4;
145 int *ipvt =
nullptr, j = 0;
150 if ((fvec = (
double *)malloc(m *
sizeof(
double))) ==
nullptr ||
151 (diag = (
double *)malloc(n *
sizeof(
double))) ==
nullptr ||
152 (qtf = (
double *)malloc(n *
sizeof(
double))) ==
nullptr ||
153 (fjac = (
double *)malloc(n * m *
sizeof(
double))) ==
nullptr ||
154 (wa1 = (
double *)malloc(n *
sizeof(
double))) ==
nullptr ||
155 (wa2 = (
double *)malloc(n *
sizeof(
double))) ==
nullptr ||
156 (wa3 = (
double *)malloc(n *
sizeof(
double))) ==
nullptr ||
157 (wa4 = (
double *)malloc(m *
sizeof(
double))) ==
nullptr || (ipvt = (
int *)malloc(n *
sizeof(
int))) ==
nullptr) {
163 for (j = 0; j < n_par; ++j)
173 wa1, wa2, wa3, wa4, evaluate, printout, control->
printflags, data);
176 (*printout)(n, par, m, data, fvec, control->
printflags, -1, 0, status->
nfev);
178 if (status->
info < 0)
198 void lm_lmpar(
int n,
double *r,
int ldr,
int *ipvt,
double *diag,
double *qtb,
double delta,
double *par,
double *x,
199 double *sdiag,
double *aux,
double *xdi);
200 void lm_qrfac(
int m,
int n,
double *a,
int pivot,
int *ipvt,
double *rdiag,
double *acnorm,
double *wa);
201 void lm_qrsolv(
int n,
double *r,
int ldr,
int *ipvt,
double *diag,
double *qtb,
double *x,
double *sdiag,
double *wa);
203 #define MIN(a, b) (((a) <= (b)) ? (a) : (b))
204 #define MAX(a, b) (((a) >= (b)) ? (a) : (b))
205 #define SQR(x) (x) * (x)
207 void lm_lmdif(
int m,
int n,
double *x,
double *fvec,
double ftol,
double xtol,
double gtol,
int maxfev,
double epsfcn,
208 double *diag,
int mode,
double factor,
int *info,
int *nfev,
double *fjac,
int *ipvt,
double *qtf,
209 double *wa1,
double *wa2,
double *wa3,
double *wa4,
210 void (*evaluate)(
const double *par,
int m_dat,
const void *data,
double *fvec,
int *info),
211 void (*printout)(
int n_par,
const double *par,
int m_dat,
const void *data,
const double *fvec,
212 int printflags,
int iflag,
int iter,
int nfev),
213 int printflags,
const void *data)
366 int i = 0, iter = 0, j = 0;
367 double actred = NAN, delta = NAN, dirder = NAN, eps = NAN, fnorm = NAN, fnorm1 = NAN, gnorm = NAN, par = NAN,
368 pnorm = NAN, prered = NAN, ratio = NAN, step = NAN, sum = NAN, temp = NAN, temp1 = NAN, temp2 = NAN,
369 temp3 = NAN, xnorm = NAN;
370 static double p1 = 0.1;
371 static double p0001 = 1.0e-4;
383 if ((n <= 0) || (m < n) || (ftol < 0.) || (xtol < 0.) || (gtol < 0.) || (maxfev <= 0) || (factor <= 0.)) {
388 for (j = 0; j < n; j++) {
389 if (diag[j] <= 0.0) {
395 #ifdef LMFIT_DEBUG_MESSAGES
402 (*evaluate)(x, m, data, fvec, info);
405 (*printout)(n, x, m, data, fvec, printflags, 0, 0, *nfev);
417 #ifdef LMFIT_DEBUG_MESSAGES
418 printf(
"lmdif/ outer loop iter=%d nfev=%d fnorm=%.10e\n", iter, *nfev, fnorm);
423 for (j = 0; j < n; j++) {
425 step =
MAX(eps * eps, eps * fabs(temp));
428 (*evaluate)(x, m, data, wa4, info);
431 (*printout)(n, x, m, data, wa4, printflags, 1, iter, *nfev);
434 for (i = 0; i < m; i++)
435 fjac[j * m + i] = (wa4[i] - fvec[i]) / step;
438 #ifdef LMFIT_DEBUG_MAtRIX
440 for (i = 0; i < m; i++) {
441 for (j = 0; j < n; j++)
442 printf(
"%.5e ", fjac[j * m + i]);
449 lm_qrfac(m, n, fjac, 1, ipvt, wa1, wa2, wa3);
456 for (j = 0; j < n; j++) {
463 for (j = 0; j < n; j++)
464 wa3[j] = diag[j] * x[j];
467 delta = factor * xnorm;
472 for (j = 0; j < n; j++)
473 diag[j] =
MAX(diag[j], wa2[j]);
479 for (i = 0; i < m; i++)
482 for (j = 0; j < n; j++) {
483 temp3 = fjac[j * m + j];
486 for (i = j; i < m; i++)
487 sum += fjac[j * m + i] * wa4[i];
489 for (i = j; i < m; i++)
490 wa4[i] += fjac[j * m + i] * temp;
492 fjac[j * m + j] = wa1[j];
499 for (j = 0; j < n; j++) {
500 if (wa2[ipvt[j]] == 0)
503 for (i = 0; i <= j; i++)
504 sum += fjac[j * m + i] * qtf[i];
505 gnorm =
MAX(gnorm, fabs(sum / wa2[ipvt[j]] / fnorm));
515 #ifdef LMFIT_DEBUG_MESSAGES
516 printf(
"lmdif/ inner loop iter=%d nfev=%d\n", iter, *nfev);
521 lm_lmpar(n, fjac, m, ipvt, diag, qtf, delta, &par, wa1, wa2, wa4, wa3);
524 for (j = 0; j < n; j++)
525 wa2[j] = x[j] - wa1[j];
532 delta =
MIN(delta, pnorm);
537 (*evaluate)(wa2, m, data, wa4, info);
540 (*printout)(n, wa2, m, data, wa4, printflags, 2, iter, *nfev);
545 #ifdef LMFIT_DEBUG_MESSAGES
546 printf(
"lmdif/ pnorm %.10e fnorm1 %.10e fnorm %.10e"
547 " delta=%.10e par=%.10e\n",
548 pnorm, fnorm1, fnorm, delta, par);
553 if (p1 * fnorm1 < fnorm)
554 actred = 1 -
SQR(fnorm1 / fnorm);
561 for (j = 0; j < n; j++) {
563 for (i = 0; i <= j; i++)
564 wa3[i] -= fjac[j * m + i] * wa1[ipvt[j]];
567 temp2 = sqrt(par) * pnorm / fnorm;
568 prered =
SQR(temp1) + 2 *
SQR(temp2);
569 dirder = -(
SQR(temp1) +
SQR(temp2));
573 ratio = prered != 0 ? actred / prered : 0;
574 #ifdef LMFIT_DEBUG_MESSAGES
575 printf(
"lmdif/ actred=%.10e prered=%.10e ratio=%.10e"
576 " sq(1)=%.10e sq(2)=%.10e dd=%.10e\n",
577 actred, prered, prered != 0 ? ratio : 0.,
SQR(temp1),
SQR(temp2), dirder);
586 temp = 0.5 * dirder / (dirder + 0.5 * actred);
587 if (p1 * fnorm1 >= fnorm || temp < p1)
589 delta = temp *
MIN(delta, pnorm / p1);
591 }
else if (par == 0. || ratio >= 0.75) {
598 if (ratio >= p0001) {
600 for (j = 0; j < n; j++) {
602 wa2[j] = diag[j] * x[j];
604 for (i = 0; i < m; i++)
610 #ifdef LMFIT_DEBUG_MESSAGES
612 printf(
"AtTN: iteration considered unsuccessful\n");
624 if (fabs(actred) <= ftol && prered <= ftol && 0.5 * ratio <= 1)
626 if (delta <= xtol * xnorm)
633 if (*nfev >= maxfev) {
652 }
while (ratio < p0001);
664 void lm_lmpar(
int n,
double *r,
int ldr,
int *ipvt,
double *diag,
double *qtb,
double delta,
double *par,
double *x,
665 double *sdiag,
double *aux,
double *xdi)
739 int i = 0, iter = 0, j = 0, nsing = 0;
740 double dxnorm = NAN, fp = NAN, fp_old = NAN, gnorm = NAN, parc = NAN, parl = NAN, paru = NAN;
741 double sum = NAN, temp = NAN;
742 static double p1 = 0.1;
744 #ifdef LMFIT_DEBUG_MESSAGES
752 for (j = 0; j < n; j++) {
754 if (r[j * ldr + j] == 0 && nsing == n)
759 #ifdef LMFIT_DEBUG_MESSAGES
760 printf(
"nsing %d ", nsing);
762 for (j = nsing - 1; j >= 0; j--) {
763 aux[j] = aux[j] / r[j + ldr * j];
765 for (i = 0; i < j; i++)
766 aux[i] -= r[j * ldr + i] * temp;
769 for (j = 0; j < n; j++)
776 for (j = 0; j < n; j++)
777 xdi[j] = diag[j] * x[j];
780 if (fp <= p1 * delta) {
781 #ifdef LMFIT_DEBUG_MESSAGES
782 printf(
"lmpar/ terminate (fp<p1*delta)\n");
794 for (j = 0; j < n; j++)
795 aux[j] = diag[ipvt[j]] * xdi[ipvt[j]] / dxnorm;
797 for (j = 0; j < n; j++) {
799 for (i = 0; i < j; i++)
800 sum += r[j * ldr + i] * aux[i];
801 aux[j] = (aux[j] - sum) / r[j + ldr * j];
804 parl = fp / delta / temp / temp;
809 for (j = 0; j < n; j++) {
811 for (i = 0; i <= j; i++)
812 sum += r[j * ldr + i] * qtb[i];
813 aux[j] = sum / diag[ipvt[j]];
816 paru = gnorm / delta;
823 *par =
MAX(*par, parl);
824 *par =
MIN(*par, paru);
826 *par = gnorm / dxnorm;
827 #ifdef LMFIT_DEBUG_MESSAGES
828 printf(
"lmpar/ parl %.4e par %.4e paru %.4e\n", parl, *par, paru);
840 for (j = 0; j < n; j++)
841 aux[j] = temp * diag[j];
843 lm_qrsolv(n, r, ldr, ipvt, aux, qtb, x, sdiag, xdi);
846 for (j = 0; j < n; j++)
847 xdi[j] = diag[j] * x[j];
856 if (fabs(fp) <= p1 * delta || (parl == 0. && fp <= fp_old && fp_old < 0.) || iter == 10)
861 for (j = 0; j < n; j++)
862 aux[j] = diag[ipvt[j]] * xdi[ipvt[j]] / dxnorm;
864 for (j = 0; j < n; j++) {
865 aux[j] = aux[j] / sdiag[j];
866 for (i = j + 1; i < n; i++)
867 aux[i] -= r[j * ldr + i] * aux[j];
870 parc = fp / delta / temp / temp;
875 parl =
MAX(parl, *par);
877 paru =
MIN(paru, *par);
882 *par =
MAX(parl, *par + parc);
891 void lm_qrfac(
int m,
int n,
double *a,
int pivot,
int *ipvt,
double *rdiag,
double *acnorm,
double *wa)
944 int i = 0, j = 0, k = 0, kmax = 0, minmn = 0;
945 double ajnorm = NAN, sum = NAN, temp = NAN;
949 for (j = 0; j < n; j++) {
951 rdiag[j] = acnorm[j];
956 #ifdef LMFIT_DEBUG_MESSAGES
963 for (j = 0; j < minmn; j++) {
970 for (k = j + 1; k < n; k++)
971 if (rdiag[k] > rdiag[kmax])
976 for (i = 0; i < m; i++) {
978 a[j * m + i] = a[kmax * m + i];
979 a[kmax * m + i] = temp;
981 rdiag[kmax] = rdiag[j];
984 ipvt[j] = ipvt[kmax];
991 ajnorm =
lm_enorm(m - j, &a[j * m + j]);
997 if (a[j * m + j] < 0.)
999 for (i = j; i < m; i++)
1000 a[j * m + i] /= ajnorm;
1006 for (k = j + 1; k < n; k++) {
1009 for (i = j; i < m; i++)
1010 sum += a[j * m + i] * a[k * m + i];
1012 temp = sum / a[j + m * j];
1014 for (i = j; i < m; i++)
1015 a[k * m + i] -= temp * a[j * m + i];
1017 if (pivot && rdiag[k] != 0.) {
1018 temp = a[m * k + j] / rdiag[k];
1019 temp =
MAX(0., 1 - temp * temp);
1020 rdiag[k] *= sqrt(temp);
1021 temp = rdiag[k] / wa[k];
1023 rdiag[k] =
lm_enorm(m - j - 1, &a[m * k + j + 1]);
1037 void lm_qrsolv(
int n,
double *r,
int ldr,
int *ipvt,
double *diag,
double *qtb,
double *x,
double *sdiag,
double *wa)
1100 int i = 0, kk = 0, j = 0, k = 0, nsing = 0;
1101 double qtbpj = NAN, sum = NAN, temp = NAN;
1102 double _sin = NAN, _cos = NAN, _tan = NAN, _cot = NAN;
1107 for (j = 0; j < n; j++) {
1108 for (i = j; i < n; i++)
1109 r[j * ldr + i] = r[i * ldr + j];
1110 x[j] = r[j * ldr + j];
1113 #ifdef LMFIT_DEBUG_MESSAGES
1119 for (j = 0; j < n; j++) {
1124 if (diag[ipvt[j]] == 0.)
1126 for (k = j; k < n; k++)
1128 sdiag[j] = diag[ipvt[j]];
1134 for (k = j; k < n; k++) {
1142 if (fabs(r[kk]) < fabs(sdiag[k])) {
1143 _cot = r[kk] / sdiag[k];
1144 _sin = 1 / sqrt(1 +
SQR(_cot));
1147 _tan = sdiag[k] / r[kk];
1148 _cos = 1 / sqrt(1 +
SQR(_tan));
1155 r[kk] = _cos * r[kk] + _sin * sdiag[k];
1156 temp = _cos * wa[k] + _sin * qtbpj;
1157 qtbpj = -_sin * wa[k] + _cos * qtbpj;
1162 for (i = k + 1; i < n; i++) {
1163 temp = _cos * r[k * ldr + i] + _sin * sdiag[i];
1164 sdiag[i] = -_sin * r[k * ldr + i] + _cos * sdiag[i];
1165 r[k * ldr + i] = temp;
1173 sdiag[j] = r[j * ldr + j];
1174 r[j * ldr + j] = x[j];
1181 for (j = 0; j < n; j++) {
1182 if (sdiag[j] == 0. && nsing == n)
1188 for (j = nsing - 1; j >= 0; j--) {
1190 for (i = j + 1; i < nsing; i++)
1191 sum += r[j * ldr + i] * wa[i];
1192 wa[j] = (wa[j] - sum) / sdiag[j];
1197 for (j = 0; j < n; j++)
1229 double agiant = NAN, s1 = NAN, s2 = NAN, s3 = NAN, xabs = NAN, x1max = NAN, x3max = NAN, temp = NAN;
1240 for (i = 0; i < n; i++) {
1243 if (xabs < agiant) {
1245 }
else if (xabs > x1max) {
1246 temp = x1max / xabs;
1247 s1 = 1 + s1 *
SQR(temp);
1250 temp = xabs / x1max;
1253 }
else if (xabs > x3max) {
1254 temp = x3max / xabs;
1255 s3 = 1 + s3 *
SQR(temp);
1257 }
else if (xabs != 0.) {
1258 temp = xabs / x3max;
1266 return x1max * sqrt(s1 + (s2 / x1max) / x1max);
1269 return sqrt(s2 * (1 + (x3max / s2) * (x3max * s3)));
1271 return sqrt(x3max * ((s2 / x3max) + (x3max * s3)));
1273 return x3max * sqrt(s3);