我在C ++中使用NLopt library
,COBYLA 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或.1ftol_abs
和xtol_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/