使用布伦特算法找到函数 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
我想知道如何使用布伦特算法,如果没有相反的符号可以提供。
例如,在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的性质的一些基本线索总是必要的,例如它实际上有一个根,它是连续的,可微的,等等。所有的寻根方法(梯度下降法、牛顿-拉夫逊法、平分法等)都假定了函数的一些基本性质。相关文章:
- 请解释这句话(cout<<1+int((a<b)^((b-a)&1) )<<endl
- 呼叫运营商<<临时
- 算术序列与区间的最大重叠
- 如何防止clang格式在流运算符调用之间添加换行符<<
- <<操作员在下面的行中工作
- 线性丢番图方程 - 求给定区间内的解数和解
- 整数区间(或 int 数组)中每个数字的出现次数
- 如果"n"是"2019"的倍数并且不在区间"(a,b)"中,
- 给定一个整数 N>0,区间 [0, 2^N) 中有多少个整数正好有 N-1 个设置位?编写一个返回正确答案的简短函数
- 如何显式调用运算符<<
- 是否有更有效的方法来检查元素是否在给定的区间内
- 获取位于特定区间的已排序值列表的子列表的最短方法
- C++显示两个区间之间的数字的程序检查一个数字是否可以表示为两个素数的总和
- 模板操作员&lt;未打电话
- C / CUDA中的模板方法是3个角括号(&lt;&lt;&lt;)
- C - 创建矢量&lt; vector&lt; double&gt;&gt;矩阵具有分配而不是inizializ
- 错误:调用"std::vector<:vector<int>>::p ush_back(std::vector<std::__cxx11::basic_string<
- C 建造者Clang STD :: Sill,找不到超载的操作员&lt;
- 为什么STD :: MAP需要操作员&lt;以及我如何写一个
- 为什么“操作员”需要const但不是为“运营商&lt;”