我需要找到给定区间内标量函数的所有根。该函数可能有不连续性。该算法可以具有 ε 的精度(例如,如果该算法没有找到两个比 ε 更接近的不同根,则可以)。
这种算法存在吗?你能给我指点这方面的论文吗?
实际上,我有一个使用布伦特算法在给定间隔中找到零的函数,以及在给定间隔中找到最小值的函数。使用这两个函数,我构建了自己的算法,但我想知道是否存在更好的算法。我的算法是这样的:
我从一个区间[a,b]
和一个函数开始f
。如果,我知道和sign(f(a+ε)) ≠ sign(f(b-ε))
之间至少有一个零,我发现。我通过查看and的值来测试是否真的是零(它可能是不连续的)。如果是,我将其添加到找到的零列表中。如果和都是肯定的,我搜索. 如果仍然是肯定的,我会搜索,因为和之间可能存在不连续性。如果是否定的,我会做相反的事情。a
b
z = zero(]a,b[)
z
z-ε
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
,极值与区间两端的符号相同,并且两个极值都没有不连续性,我从堆栈中删除区间。当没有更多间隔时,算法结束。