C++ 使用Brent算法找到具有初始猜测但没有区间的函数f的根[a,b]s.t.f(a)f(b)<;0

C++ 使用Brent算法找到具有初始猜测但没有区间的函数f的根[a,b]s.t.f(a)f(b)<;0,c++,algorithm,mathematical-optimization,fminsearch,C++,Algorithm,Mathematical Optimization,Fminsearch,如果没有相反的符号,我想知道如何使用布伦特算法 例如,在中,实现Brent方法的根查找过程必须以 双零(双a、双b、双t、函数基和f); 其中a,b满足相反符号的条件:f(a)。f(b)

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

例如,在中,实现Brent方法的根查找过程必须以

双零(双a、双b、双t、函数基和f); 其中a,b满足相反符号的条件:
f(a)。f(b)<0


在我的问题设置中,我需要找到黑盒函数f的根。提供了初始猜测,但没有端点a、b,因此f(a)f(b)不进行穷举搜索(在实值函数的情况下,您不能,因为
x
的值为),如果存在这样的根,则无法真正保证找到根

解决该问题的一种启发式方法是使用函数值最小化(/最大化),直到找到局部最小值(/最大值)或根为止


这种方法的问题是,在找到根之前,您可能会陷入局部最小值(/最大值),并且“认为”没有根,即使根确实存在。

不进行穷举搜索(对于实值函数,您不能,因为
x
的值为),如果存在这样的根,就无法真正保证找到根

解决该问题的一种启发式方法是使用函数值最小化(/最大化),直到找到局部最小值(/最大值)或根为止


这种方法的问题是,在找到根之前,您可能会陷入局部最小值(/最大值),并且“认为”没有根,即使根确实存在。

假设

  • f是一个黑匣子,即可以对其进行评估,但不知道其形状的任何信息

  • 您必须使用一种方法,该方法需要对包含f的根的区间[a,b]有先验知识(假设f是连续的)

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


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

在以下假设下:

  • f是一个黑匣子,即可以对其进行评估,但不知道其形状的任何信息

  • 您必须使用一种方法,该方法需要对包含f的根的区间[a,b]有先验知识(假设f是连续的)

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

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

Matlab显然在其
fmin
实现的一部分中使用了。Matlab显然在其
fmin
实现的一部分中使用了。