Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-cloud-platform/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用特征值'的参数边界;s Levenberg Marquardt_C++_Eigen_Levenberg Marquardt - Fatal编程技术网

C++ 使用特征值'的参数边界;s Levenberg Marquardt

C++ 使用特征值'的参数边界;s Levenberg Marquardt,c++,eigen,levenberg-marquardt,C++,Eigen,Levenberg Marquardt,我正在使用Eigen的Levenberg-Marquardt实现,并想知道如何在应该优化的参数上设置一些边界 当我将一些GNU倍频程程序迁移到Eigen时,我预计可能会有一些边界,可以很容易地作为模块的参数提供 我的实现的布局与中的几乎相同。 我不提供df()实现,而是使用Eigen::NumericalDiff来近似它 那么,我如何在为minimize()提供的参数上强制一些边界呢? 在离开预期范围时,我曾考虑将运算符()中的错误(fvec)设置为一些高值,但在一些小测试中,这导致了奇怪的结果

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

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

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

那么,我如何在为minimize()提供的参数上强制一些边界呢?
在离开预期范围时,我曾考虑将运算符()中的错误(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))
}