#include #include namespace Upp { using namespace Eigen; bool NonLinearOptimization(VectorXd &y, Eigen::Index numData, Function Residual) { Basic_functor functor(Residual); functor.unknowns = y.size(); functor.datasetLen = numData; Eigen::NumericalDiff numDiff(functor); Eigen::LevenbergMarquardt > lm(numDiff); 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; } }