diff --git a/unsupported/Eigen/NonLinear b/unsupported/Eigen/NonLinear index a01d705cd..ac0f787e1 100644 --- a/unsupported/Eigen/NonLinear +++ b/unsupported/Eigen/NonLinear @@ -127,7 +127,6 @@ Scalar ei_enorm ( int n, const Scalar *x ){ // return Map< Matrix< Scalar, Dynamic, 1 > >(x,n).blueNorm(); } -#include "src/NonLinear/lmder1.h" #include "src/NonLinear/lmder.h" #include "src/NonLinear/hybrd1.h" #include "src/NonLinear/hybrd.h" @@ -139,6 +138,7 @@ Scalar ei_enorm ( int n, const Scalar *x ){ #include "src/NonLinear/hybrj.h" #include "src/NonLinear/chkder.h" #include "src/NonLinear/MathFunctions.h" +#include "src/NonLinear/lmder1.h" //@} diff --git a/unsupported/Eigen/src/NonLinear/MathFunctions.h b/unsupported/Eigen/src/NonLinear/MathFunctions.h index c9262075a..ad16d77e8 100644 --- a/unsupported/Eigen/src/NonLinear/MathFunctions.h +++ b/unsupported/Eigen/src/NonLinear/MathFunctions.h @@ -216,32 +216,6 @@ int ei_lmstr( ); } - - -template -int ei_lmder1( - Matrix< Scalar, Dynamic, 1 > &x, - Matrix< Scalar, Dynamic, 1 > &fvec, - VectorXi &ipvt, - Scalar tol = ei_sqrt(epsilon()) - ) -{ - int lwa = 5*x.size()+fvec.size(); - int ldfjac = fvec.size(); - Matrix< Scalar, Dynamic, 1 > wa(lwa); - Matrix< Scalar, Dynamic, Dynamic > fjac(ldfjac, x.size()); - - ipvt.resize(x.size()); - return lmder1_template ( - Functor::f, 0, - fvec.size(), x.size(), x.data(), fvec.data(), - fjac.data() , ldfjac, - tol, - ipvt.data(), - wa.data(), lwa - ); -} - template int ei_lmder( Matrix< Scalar, Dynamic, 1 > &x, diff --git a/unsupported/Eigen/src/NonLinear/lmder1.h b/unsupported/Eigen/src/NonLinear/lmder1.h index 51f1a479f..f1322261d 100644 --- a/unsupported/Eigen/src/NonLinear/lmder1.h +++ b/unsupported/Eigen/src/NonLinear/lmder1.h @@ -1,62 +1,34 @@ -template -int lmder1_template(minpack_funcder_mn fcn, void *p, int m, int n, Scalar *x, - Scalar *fvec, Scalar *fjac, int ldfjac, Scalar tol, - int *ipvt, Scalar *wa, int lwa) +template +int ei_lmder1( + Matrix< Scalar, Dynamic, 1 > &x, + Matrix< Scalar, Dynamic, 1 > &fvec, + VectorXi &ipvt, + Scalar tol = ei_sqrt(epsilon()) + ) { - /* Initialized data */ + const int n = x.size(), m=fvec.size(); + int info, nfev, njev; + Matrix< Scalar, Dynamic, Dynamic > fjac(m, n); + Matrix< Scalar, Dynamic, 1> diag; + ipvt.resize(n); - const Scalar factor = 100.; - - /* System generated locals */ - int fjac_dim1, fjac_offset; - - /* Local variables */ - int mode, nfev, njev; - Scalar ftol, gtol, xtol; - int maxfev, nprint; - int info; - - /* Parameter adjustments */ - --fvec; - --ipvt; - --x; - fjac_dim1 = ldfjac; - fjac_offset = 1 + fjac_dim1 * 1; - fjac -= fjac_offset; - --wa; - - /* Function Body */ - info = 0; /* check the input parameters for errors. */ - - if (n <= 0 || m < n || ldfjac < m || tol < 0. || lwa < n * 5 + - m) { - /* goto L10; */ - printf("lmder1 bad args : m,n,tol,..."); - return info; + if (n <= 0 || m < n || tol < 0.) { + printf("ei_lmder1 bad args : m,n,tol,..."); + return 0; } -/* call lmder. */ - - maxfev = (n + 1) * 100; - ftol = tol; - xtol = tol; - gtol = 0.; - mode = 1; - nprint = 0; - info = lmder(fcn, p, m, n, &x[1], &fvec[1], &fjac[fjac_offset], ldfjac, - ftol, xtol, gtol, maxfev, &wa[1], mode, factor, nprint, - &nfev, &njev, &ipvt[1], &wa[n + 1], &wa[(n << 1) + 1], & - wa[n * 3 + 1], &wa[(n << 2) + 1], &wa[n * 5 + 1]); - if (info == 8) { - info = 4; - } -/* L10: */ - return info; - -/* last card of subroutine lmder1. */ - -} /* lmder1_ */ + info = ei_lmder( + x, fvec, + nfev, njev, + fjac, ipvt, diag, + 1, + 100., + (n+1)*100, + tol, tol, Scalar(0.) + ); + return (info==8)?4:info; +}