我需要在给定的时间间隔中找到标量函数的所有根。该功能可能有间断。该算法可以具有ε的精度(例如,如果算法没有找到比ε更近的两个不同的根,则可以。
是否存在这种算法?你能指出我有关那篇论文吗?
实际上,我有一个使用布伦特算法在给定间隔中找到零的函数,以及一个在给定间隔中找到最小值的函数。使用这两个函数,我建立了自己的算法,但是我想知道是否存在更好的算法。我的算法是这样的:
我从一个间隔[a,b]
和一个函数开始f
。如果sign(f(a+ε)) ≠ sign(f(b-ε))
我知道a
和之间至少有一个零b
,我发现z = zero(]a,b[)
。z
通过查看z-ε
and 的值,我测试是否真的为零(可能是不连续性)z+ε
。如果是,我将其添加到找到的零列表中。如果f(a+ε)
和f(b-ε)
均为正,我搜索m = min(]a, b[)
。如果f(m)
仍为正,我搜索m = max(]a,b[)
是因为a
和之间可能存在不连续性b
。如果f(a+ε)
和f(b-ε)
为负,我则相反。
现在,从发现(z
或m
)的点开始,我将构建一个堆栈,其中包含函数的零,不连续和拐点。第一次迭代后,堆栈现在看起来像[a, z, b]
。我再次从时间间隔]a,z[
和开始算法]z,b[
。当在两个点a
和之间b
,极值具有与两个区间结束相同的符号,并且两个极点都没有不连续性时,我从堆栈中删除了该区间。没有更多时间间隔时该算法结束。