我在C ++中有一个循环程序,它包括一个函数的组合(每次都不同)并进一步最小化它。使用GiNaC包(符号表达式)实现函数的组合。
我尝试使用Matlab fmincon
函数最小化函数,但是在将字符串转换为lambda函数时它占用了所有内存(函数相当复杂)。而且我无法以任何方式将函数从C ++导出到Matlab,而是作为字符串。
有没有办法组成一个复杂的函数(3个变量,sin-cos-square root等)并最小化它而不用自己确定梯度,因为我不知道函数在运行程序之前是怎么看的?
我也看了NLopt
,据我所知,它需要程序员写的渐变。
答案 0 :(得分:1)
大多数优化算法都需要渐变。但是,如果不可能直接“知道”它,您可以考虑每个坐标的小增量来评估它。如果你的F函数取决于x
向量的坐标,你可以将梯度向量G的i分量近似为
x1 = x;
x1[i] += dx;
G[i] = (F(x1) - F(x))/dx;
其中dx
是一个小的增量。虽然这样的计算是近似的,但如果dx
足够小,通常绝对有利于最小的发现。