boost::math::tools::brent_find_minima
的This文档页面介绍了其第一个参数:
要最小化的函数:一个函数对象(或C ++ lambda)...在该间隔内没有最大值出现。
但是,如果不是这种情况怎么办? (毕竟,这种情况很难预先确定,尤其是因为该函数通常在很多地方进行评估都非常昂贵。)最好的方法是即时检测对该条件的违反情况。
如果违反此条件,boost会抛出异常,还是表现出未定义的行为?
我正在考虑的一种解决方法是,通过捕获并维护包含所有已评估点的std::map<double,double>
并将每个新评估与其在每个方向上最近的邻居,以检查是否可能存在局部最大值。但是如果不需要的话,我不想做所有的事情。
答案 0 :(得分:0)
无法完成此操作。如果您阅读Corless的数值方法研究生导论,您会读到一个非常有趣的观点:所有数字定义的函数在可表示对象之间都是不连续的,并且可表示对象之间的导数为零。基本上,它们可以看作是Heaviside函数的总和。
所以它们没有一个在数学意义上是可区分的。好的,也许您认为这有点不公平-应该缩小比例。但是多少钱?我们知道|x-1|
在x=1
上是不可区分的,但是计算机如何分辨呢?如何知道在x=1-eps
和x=1+eps
之间没有可区分的局部平滑修饰符?我认为这个问题没有很好的答案。
此类中最困难的问题之一是正交。当函数的复杂扩展的极点远离实轴时,其中一些方法会快速工作。尝试以数字方式确定那个。
无法通过数字确定函数空间。用户只需要正确处理即可。