From 74f660ecdff9a7ea90516394eb79fe26ac35eeba Mon Sep 17 00:00:00 2001 From: koldo Date: Wed, 15 Jul 2020 07:55:37 +0000 Subject: [PATCH] Eigen: Improvements in NonLinearOptimization() git-svn-id: svn://ultimatepp.org/upp/trunk@14682 f0d560ea-af0d-0410-9eb7-867de7ffcac7 --- uppsrc/plugin/Eigen/Eigen.cpp | 12 ++++++++++-- uppsrc/plugin/Eigen/Eigen.h | 4 +++- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/uppsrc/plugin/Eigen/Eigen.cpp b/uppsrc/plugin/Eigen/Eigen.cpp index 2ebe7c5f2..89aae913c 100644 --- a/uppsrc/plugin/Eigen/Eigen.cpp +++ b/uppsrc/plugin/Eigen/Eigen.cpp @@ -5,15 +5,23 @@ namespace Upp { using namespace Eigen; -bool NonLinearOptimization(VectorXd &y, Eigen::Index numData, Function Residual) { +bool NonLinearOptimization(VectorXd &y, Eigen::Index numData, + Function Residual, + double xtol, double ftol, int maxfev) { Basic_functor functor(Residual); functor.unknowns = y.size(); functor.datasetLen = numData; Eigen::NumericalDiff numDiff(functor); Eigen::LevenbergMarquardt > lm(numDiff); + if (!IsNull(xtol)) + lm.parameters.xtol *= xtol; + if (!IsNull(ftol)) + lm.parameters.ftol *= ftol; + if (!IsNull(maxfev)) + lm.parameters.maxfev = maxfev; int ret = lm.minimize(y); if (ret == Eigen::LevenbergMarquardtSpace::ImproperInputParameters || - ret == Eigen::LevenbergMarquardtSpace::TooManyFunctionEvaluation) + ret == Eigen::LevenbergMarquardtSpace::TooManyFunctionEvaluation) return false; return true; } diff --git a/uppsrc/plugin/Eigen/Eigen.h b/uppsrc/plugin/Eigen/Eigen.h index b8738066e..7ec758748 100644 --- a/uppsrc/plugin/Eigen/Eigen.h +++ b/uppsrc/plugin/Eigen/Eigen.h @@ -48,7 +48,9 @@ struct Basic_functor : NonLinearOptimizationFunctor { Function function; }; -bool NonLinearOptimization(Eigen::VectorXd &y, Eigen::Index numData, Function residual); +bool NonLinearOptimization(Eigen::VectorXd &y, Eigen::Index numData, + Function residual, + double xtol = Null, double ftol = Null, int maxfev = Null); bool SolveNonLinearEquations(Eigen::VectorXd &y, Function Residual); template