我需要找到给定区间内标量函数的所有根。该函数可能有不连续性。该算法可以具有 ε 的精度(例如,如果该算法没有找到两个比 ε 更接近的不同根,则可以)。
这种算法存在吗?你能给我指点这方面的论文吗?
实际上,我有一个使用布伦特算法在给定间隔中找到零的函数,以及在给定间隔中找到最小值的函数。使用这两个函数,我构建了自己的算法,但我想知道是否存在更好的算法。我的算法是这样的:
我从一个区间[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-ε)
现在,从我发现 (z或m) 的点开始,我构建了一个堆栈,其中包含函数的零点、不连续点和拐点。第一次迭代后,堆栈现在看起来像[a, z, b]. 我从区间]a,z[和重新开始算法]z,b[。当在两点a和之间b,极值与区间两端的符号相同,并且两个极值都没有不连续性,我从堆栈中删除区间。当没有更多间隔时,算法结束。