找出给定区间内函数的所有根

计算科学 算法
2021-12-11 06:14:22

我需要找到给定区间内标量函数的所有根。该函数可能有不连续性。该算法可以具有 ε 的精度(例如,如果该算法没有找到两个比 ε 更接近的不同根,则可以)。

这种算法存在吗?你能给我指点这方面的论文吗?


实际上,我有一个使用布伦特算法在给定间隔中找到零的函数,以及在给定间隔中找到最小值的函数。使用这两个函数,我构建了自己的算法,但我想知道是否存在更好的算法。我的算法是这样的:

我从一个区间[a,b]和一个函数开始f如果,我知道sign(f(a+ε)) ≠ sign(f(b-ε))之间至少有一个零,我发现我通过查看and的值来测试是否真的是零(它可能是不连续的)如果是,我将其添加到找到的零列表中。如果都是肯定的,我搜索. 如果仍然是肯定的,我会搜索,因为之间可能存在不连续性如果是否定的我会做相反的事情。abz = zero(]a,b[)zz-εz+εf(a+ε)f(b-ε)m = min(]a, b[)f(m)m = max(]a,b[)abf(a+ε)f(b-ε)

现在,从我发现 (zm) 的点开始,我构建了一个堆栈,其中包含函数的零点、不连续点和拐点。第一次迭代后,堆栈现在看起来像[a, z, b]. 我从区间]a,z[和重新开始算法]z,b[当在两点a和之间b,极值与区间两端的符号相同,并且两个极值都没有不连续性,我从堆栈中删除区间。当没有更多间隔时,算法结束。

2个回答

如果你使用的是 Matlab,你可能想试试Chebfun系统(免责声明:我曾经是这个项目的活跃开发者)。它可以在机器精度的闭区间或开区间中找到一维函数的所有根。

Chebfun root-finder 背后的主要思想是在目标函数的插值系数上使用递归二分法和同事矩阵(同伴矩阵的类似物)的组合。

我在这里有代码的简化版本。该函数chebroots将匿名函数作为其第一个输入,将有限区间作为第二个和第三个参数,将度数N作为它的第四个和最后一个参数。为了获得合理的结果,您可以设置N100

一般来说,这是一个无望的探索——如果没有关于函数的连续性和/或可微性的一些信息,任何事情都可能发生。例如,考虑在 0 到 1 的区间上定义的 MATLAB 函数:

函数 y=f(x)

y=1.0;

如果 (x==0.01)

y=0.0;

结尾

如果 (x==0.013)

y=0.0;

结尾

如果 (x==0.753124)

y=0.0;

结尾

将此函数视为一个块框,如果不检查 0 到 1 之间的每个浮点数,就无法看到它在这三个点处为零,并且在 0 到 1 的区间内没有其他点。