#include #include "Eigen.h" namespace Upp { using namespace Eigen; 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) return false; return true; } bool SolveNonLinearEquations(VectorXd &y, Function Residual) { Basic_functor functor(Residual); HybridNonLinearSolver solver(functor); int ret = solver.solveNumericalDiff(y); if (ret == HybridNonLinearSolverSpace::ImproperInputParameters || ret == HybridNonLinearSolverSpace::TooManyFunctionEvaluation || ret == HybridNonLinearSolverSpace::NotMakingProgressJacobian || ret == HybridNonLinearSolverSpace::NotMakingProgressIterations) return false; return true; } }