问题:最近我被要求设计一个非线性求解器,但是我的求解器没有收敛到正确的解。
**预期**:'minimize(x)'方法应将我的参数 vector x降至最小值。
观察到的:在我调用“minimize(x)”后,我得到一个状态返回,显示RelativeErrorTooSmall。
问题:有人可以解释一下此枚举值的含义吗?
文档:关于Eigen Levenberg Marquardt类的唯一可用文档基本上是.h文件。这是枚举列表:
enum Status {
NotStarted = -2,
Running = -1,
ImproperInputParameters = 0,
RelativeReductionTooSmall = 1,
RelativeErrorTooSmall = 2,
RelativeErrorAndReductionTooSmall = 3,
CosinusTooSmall = 4,
TooManyFunctionEvaluation = 5,
FtolTooSmall = 6,
XtolTooSmall = 7,
GtolTooSmall = 8,
UserAsked = 9
};
这是头文件的链接:https://eigen.tuxfamily.org/dox/unsupported/NonLinearOptimization_2LevenbergMarquardt_8h_source.html
这是先前的堆栈溢出问题,其中包含测试程序:
How to use the Eigen unsupported levenberg marquardt implementation?
最佳答案
搜索.h文件表明,此返回码意味着在某些步骤该算法无法声明成功,但在该步骤上调整参数方面进展甚微。
if (delta <= parameters.xtol * xnorm)
return LevenbergMarquardtSpace::RelativeErrorTooSmall;
xnorm术语是通过算法动态计算的。它是在某种绝对意义上参数倾向于达到多大的估计。 (优良作法是将问题扩展为参数的绝对值趋于统一。)Parameters.xtol是用户可以将参数设置为“小”差异的数字。典型值是机器效率的平方根。实际上,这是代码中的默认值。
假设库代码正确,那么收敛失败可能是由于以下原因之一:
我拥有自己的经过测试和超快速的求解器。我很想与您取得联系,但是SO对此并不热衷。
关于c++ - 了解Levenberg Marquardt枚举返回。,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48213584/