在给定的间隔中找到函数的所有根


9

我需要在给定的时间间隔中找到标量函数的所有根。该功能可能有间断。该算法可以具有ε的精度(例如,如果算法没有找到比ε更近的两个不同的根,则可以。

是否存在这种算法?你能指出我有关那篇论文吗?


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

我从一个间隔[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-ε)为负,我则相反。

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


2
有一些基于间隔算法的方法。
lhf

Answers:


6

如果您使用的是Matlab,则可能需要尝试Chebfun系统(免责声明:我曾经是该项目的积极开发人员)。它可以在封闭或开放间隔中找到一维函数的所有根,以提高机器精度。

Chebfun寻根器的主要思想是在目标函数的插值系数上使用递归二等分和同事矩阵(同伴矩阵的类似物)的组合。

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


0

通常,这是一个绝望的追求,如果没有有关功能的连续性和/或差异性的任何信息,任何事情都会发生。考虑一下从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的区间中没有其他点。


1
这些零显然是找不到的,但是@Charles似乎最感兴趣的是具有跳跃间断的黑匣子功能,而不是所谓的可移动间断。
Bill Barth

1
即使您将自己限制为不连续跳跃,即使您将自己限制为连续函数,如果该函数在已知的时间间隔内都不是Lipschitz连续的,那么在有限的点上从求值中找到所有零也不会确保您得到所有的根源。
Brian Borchers

特别要考虑功能 1个/X 例如,在区间上找到所有零 [01个]将是困难的。
Wolfgang Bangerth

OP愿意指定一个 ϵ。如果函数是病理性的,它将找到许多零,但这似乎就是生命。他可能还必须为搜索设置最大间隔数,以免出现此类疾病。
比尔·巴特
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.