检测`boost :: math :: tools :: brent_find_minima()的错误输入。

时间:2019-05-22 18:30:40

标签: c++ boost boost-math

boost::math::tools::brent_find_minima

This文档页面介绍了其第一个参数:

  

要最小化的函数:一个函数对象(或C ++ lambda)...在该间隔内没有最大值出现。

但是,如果不是这种情况怎么办? (毕竟,这种情况很难预先确定,尤其是因为该函数通常在很多地方进行评估都非常昂贵。)最好的方法是即时检测对该条件的违反情况。

如果违反此条件,boost会抛出异常,还是表现出未定义的行为?

我正在考虑的一种解决方法是,通过捕获并维护包含所有已评估点的std::map<double,double>并将每个新评估与其在每个方向上最近的邻居,以检查是否可能存在局部最大值。但是如果不需要的话,我不想做所有的事情。

1 个答案:

答案 0 :(得分:0)

无法完成此操作。如果您阅读Corless的数值方法研究生导论,您会读到一个非常有趣的观点:所有数字定义的函数在可表示对象之间都是不连续的,并且可表示对象之间的导数为零。基本上,它们可以看作是Heaviside函数的总和。

所以它们没有一个在数学意义上是可区分的。好的,也许您认为这有点不公平-应该缩小比例。但是多少钱?我们知道|x-1|x=1上是不可区分的,但是计算机如何分辨呢?如何知道在x=1-epsx=1+eps之间没有可区分的局部平滑修饰符?我认为这个问题没有很好的答案。

此类中最困难的问题之一是正交。当函数的复杂扩展的极点远离实轴时,其中一些方法会快速工作。尝试以数字方式确定那个

无法通过数字确定函数空间。用户只需要正确处理即可。