我在C ++中使用NLopt libraryCOBYLA algorithm来最小化基于日志的成本函数。我已经在Matlab中使用fmincom实现了相同的功能。
Matlab函数的性能比NLopt好得多。与NLopt相比,它所需的优化次数要少得多,并且收敛到比NLopt更好的最小值。

我相信用于算法的补充选项是不同的。我试图为NLopt复制与在Matlab中的fmincon中的默认参数相同的参数,但它仍然无法给出相似的结果。

我需要知道如何使用NLopt中的COBYLA以类似于Matlab的方式进行收敛。
提前致谢

最佳答案

为什么选择COBYLA?
fmincon更像afaik
NLopt L-BFGS
另请参见LBFGS
他们使用梯度估算
因此当func()→二次时,收敛速度比COBYLA的线性逼近速度快得多。
我建议


打印/绘制两个优化器的所有func值(在函数内部打印)
同时发布所有选项; COBYLA对Rhobeg和Rhoend非常敏感
尝试
NLopt L-BFGS,或
NLopt BOBYQA
“迭代构造的二次逼近”。



添加:
fmincom用途


  “用于估计梯度的有限差分是'正向'(默认)或'中央'...”


自动。
您可以运行L-BFGS或任何梯度优化器,
像单边或中心差之类的梯度估算器。
通常,对于嘈杂的功能或接近边界的情况,这可能是一个差的估计;
但它在fmincom中对您有效,因此也应在NLopt L-BFGS中工作。
首先尝试一下,然后再花时间使用完全不同的方法。

您需要设置以下NLopt参数:
initial_step例如1或.1
ftol_absxtol_abs例如1e-4,不小于所需的大小
(对于COBYLA,initial_step→rhobegin和initial_step缩放后的x xtol_abs→rhoend。)

NB打印任何优化程序的返回代码:为什么停止?

关于c++ - C++:与Matlab fmincon相比,NLopt COBYLA,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23105718/

10-12 18:59