ultimatepp/uppsrc/plugin/Eigen/Eigen.cpp
koldo 3d85f5f2c2 *Eigen: Removed GPL license files
git-svn-id: svn://ultimatepp.org/upp/trunk@15066 f0d560ea-af0d-0410-9eb7-867de7ffcac7
2020-09-18 16:45:10 +00:00

46 lines
No EOL
1.5 KiB
C++

#include <Core/Core.h>
#include "Eigen.h"
namespace Upp {
using namespace Eigen;
bool NonLinearOptimization(VectorXd &y, Eigen::Index numData,
Function <int(const VectorXd &b, VectorXd &residual)> Residual,
double xtol, double ftol, int maxfev) {
Basic_functor functor(Residual);
functor.unknowns = y.size();
functor.datasetLen = numData;
Eigen::NumericalDiff<Basic_functor> numDiff(functor);
Eigen::LevenbergMarquardt<Eigen::NumericalDiff<Basic_functor> > 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 <int(const VectorXd &b, VectorXd &residual)> Residual,
double xtol, int maxfev) {
Basic_functor functor(Residual);
HybridNonLinearSolver<Basic_functor> solver(functor);
if (!IsNull(xtol))
solver.parameters.xtol *= xtol;
if (!IsNull(maxfev))
solver.parameters.maxfev = maxfev;
int ret = solver.solveNumericalDiff(y);
if (ret == HybridNonLinearSolverSpace::ImproperInputParameters ||
ret == HybridNonLinearSolverSpace::TooManyFunctionEvaluation ||
ret == HybridNonLinearSolverSpace::NotMakingProgressJacobian ||
ret == HybridNonLinearSolverSpace::NotMakingProgressIterations)
return false;
return true;
}
}