C++ 使用特征值'的参数边界;s Levenberg Marquardt
我正在使用Eigen的Levenberg-Marquardt实现,并想知道如何在应该优化的参数上设置一些边界 当我将一些GNU倍频程程序迁移到Eigen时,我预计可能会有一些边界,可以很容易地作为模块的参数提供 我的实现的布局与中的几乎相同。 我不提供df()实现,而是使用Eigen::NumericalDiff来近似它 那么,我如何在为minimize()提供的参数上强制一些边界呢?C++ 使用特征值'的参数边界;s Levenberg Marquardt,c++,eigen,levenberg-marquardt,C++,Eigen,Levenberg Marquardt,我正在使用Eigen的Levenberg-Marquardt实现,并想知道如何在应该优化的参数上设置一些边界 当我将一些GNU倍频程程序迁移到Eigen时,我预计可能会有一些边界,可以很容易地作为模块的参数提供 我的实现的布局与中的几乎相同。 我不提供df()实现,而是使用Eigen::NumericalDiff来近似它 那么,我如何在为minimize()提供的参数上强制一些边界呢? 在离开预期范围时,我曾考虑将运算符()中的错误(fvec)设置为一些高值,但在一些小测试中,这导致了奇怪的结果
在离开预期范围时,我曾考虑将运算符()中的错误(fvec)设置为一些高值,但在一些小测试中,这导致了奇怪的结果。我找到了一个至少对我有效的解决方案 其思想是一旦参数离开其正常边界,就增加误差向量 这可以通过以下功能实现:
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))
}