0

我正在使用 Eigen 的 Levenberg-Marquardt 实现,想知道如何为应该优化的参数设置一些界限。

当我将一些 GNU octave 程序迁移到 Eigen 时,我预计可能会有一些边界可以很容易地作为模块的参数提供。

我实现的布局与本示例中的几乎相同。我没有提供 df() 实现,而是使用 Eigen::NumericalDiff 来近似它。

那么如何对提供给最小化()的参数实施一些限制?当离开我的预期范围时,我考虑过将 operator() 中的错误(fvec)设置为一些较高的值,但在一些小型测试中,这导致了奇怪的结果。

4

1 回答 1

0

我找到了一个至少对我有用的解决方案。

这个想法是一旦参数离开它们的理智边界,就增加误差向量。

这可以通过以下函数来实现:

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))
}
于 2021-06-04T08:42:28.253 回答