使用布伦特算法找到函数 f 的根,带有初始猜测,但没有区间 [a,b] s.t. f(a)f(b)<0

Using Brent algorithm to find the root of a function f with an initial guess, but without intervals [a,b] s.t. f(a)f(b)<0

本文关键字:区间 lt 算法 布伦特 函数 的根      更新时间:2023-10-16

我想知道如何使用布伦特算法,如果没有相反的符号可以提供。

例如,在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是一个黑盒子,即它可以被评估,但无论如何都不知道它的形状。

  • 你必须使用一种方法,该方法需要先验地知道区间[ab],它将f的根括起来(假设f是连续的)

我认为你唯一的选择是初步搜索两个有效的点ab。这可以通过多种方式实现。最简单的方法可能是从您最初的猜测开始运行线性搜索(带有一些规定的步骤),如果结果不成功,可以使用更精细的步骤重复该搜索。如果f不是太"怪异",一个简单的方法就可以了。

显然,关于f的性质的一些基本线索总是必要的,例如它实际上有一个根,它是连续的,可微的,等等。所有的寻根方法(梯度下降法、牛顿-拉夫逊法、平分法等)都假定了函数的一些基本性质。