我正在使用Eigen的Levenberg-Marquardt实现,并想知道如何为应该优化的参数设置一些边界。
当我将一些GNU octave程序迁移到Eigen时,我预计可能会有一些边界,这些边界可以很容易地作为参数提供给模块。
我的实现的布局几乎与this example中的布局相同。我不提供df()实现,而是使用Eigen::NumericalDiff来近似它。
那么,我如何在提供给minimize()的参数上强制一些边界呢?我想过在离开我的预期范围时,将操作符()中的误差(Fvec)设置为一些较高的值,但在一些小型测试中,这导致了奇怪的结果。
发布于 2021-06-04 16:42:28
我找到了一个解决方案,至少对我来说是有效的。
这个想法是,一旦参数离开其正常边界,就增加误差向量。
这可以通过以下函数来实现:
penalize(x1, x2) = 1 + (exp(x1-x1max)*b1) + exp((x1min-x1)*b1) + exp((x2-x2max)*b2) + exp((x2min-x2)*b2)b1/b2/...必须根据边界进行拾取。在我的例子中,我开始使用b1=0.1,范围是1600...3200。该函数可以很容易地扩展到所使用的参数数量。
像这样使用函数:
int operator(x, fvec) const
{
fvec(i) = ... * penalize(x(1), x(2))
}https://stackoverflow.com/questions/67734419
复制相似问题