C ++中匿名函数的最小化

时间:2015-11-17 10:58:25

标签: c++ lambda minimization

我在C ++中有一个循环程序,它包括一个函数的组合(每次都不同)并进一步最小化它。使用GiNaC包(符号表达式)实现函数的组合。  我尝试使用Matlab fmincon函数最小化函数,但是在将字符串转换为lambda函数时它占用了所有内存(函数相当复杂)。而且我无法以任何方式将函数从C ++导出到Matlab,而是作为字符串。 有没有办法组成一个复杂的函数(3个变量,sin-cos-square root等)并最小化它而不用自己确定梯度,因为我不知道函数在运行程序之前是怎么看的? 我也看了NLopt,据我所知,它需要程序员写的渐变。

1 个答案:

答案 0 :(得分:1)

大多数优化算法都需要渐变。但是,如果不可能直接“知道”它,您可以考虑每个坐标的小增量来评估它。如果你的F函数取决于x向量的坐标,你可以将梯度向量G的i分量近似为

x1 = x;
x1[i] += dx;
G[i] = (F(x1) - F(x))/dx;

其中dx是一个小的增量。虽然这样的计算是近似的,但如果dx足够小,通常绝对有利于最小的发现。