我想知道如何使用布伦特算法,如果没有相反的符号可以提供。
例如,在Brent算法的c++库中,必须以
的形式在头文件后面使用实现Brent方法的根查找过程。双0(双a,双b,双t, func_base&f);式中a, b满足符号相反的条件:f(a).f(b) < 0
在我的问题设置中,我需要找到一个黑盒子函数f的根(s)。提供了一个初始猜测,但没有端点a,b,使得f(a) f(b)<0提供。似乎在Matlab中有一个函数fmin只需要初始猜测。我想知道如何使用c++做到这一点,特别是使用布伦特的实现,如上面链接的那个?
谢谢你的建议。
如果不进行穷举搜索(对于实值函数,不能进行穷举搜索,因为x
的值是不可数的),就无法真正保证找到存在的根。
解决这个问题的一种启发式方法是使用梯度下降,以便最小化(/最大化)函数的值,直到找到一个局部最小值(/最大值)或直到找到一个根。
这种方法的问题是,在找到根之前,您可能会陷入局部最小值(/最大值),并且"认为"没有根,即使存在根。
假设
-
f是一个黑盒子,即它可以被评估,但无论如何都不知道它的形状。
-
你必须使用一种方法,该方法需要先验地知道区间[a,b],它将f的根括起来(假设f是连续的)
我认为你唯一的选择是初步搜索两个有效的点a和b。这可以通过多种方式实现。最简单的方法可能是从您最初的猜测开始运行线性搜索(带有一些规定的步骤),如果结果不成功,可以使用更精细的步骤重复该搜索。如果f不是太"怪异",一个简单的方法就可以了。
显然,关于f的性质的一些基本线索总是必要的,例如它实际上有一个根,它是连续的,可微的,等等。所有的寻根方法(梯度下降法、牛顿-拉夫逊法、平分法等)都假定了函数的一些基本性质。