我看到的主要问题是,如果您实际上可以找到 所有的
根源,就像注释中已经提到的那样,这并非总是可能的。如果您确定您的功能不完全是病态的(
sin(1/x)已经提到过),那么下一个就是您对缺少一个或多个根的容忍度是多少。换句话说,要确保您没有错过任何东西,要准备多长时间
—据我所知,没有通用的方法可以为您隔离所有根,因此您必须自己做。您所显示的已经是一个合理的第一步。几点评论:
- 布伦特的方法在这里确实是一个不错的选择。
- 首先,应对分歧。由于在您的函数中分母中存在贝塞尔,因此您可以首先求解 它们的根源 -更好地在例如Abramovitch和Stegun中查找它们(Mathworld链接)。这将比使用您正在使用的临时网格更好。
- 你可以做什么,一旦你发现了两个根或分歧,
x_1
并且x_2
,在该区间再次搜索[x_1+epsilon, x_2-epsilon]
。继续,直到没有更多的根被找到(Brent的方法保证收敛到 一个 根,提供有一个)。 - 如果您无法列举所有差异,则可能需要更加仔细地核实候选人是否确实存在差异:
x
不仅要检查f(x)
较大的 物体,还应检查例如(1e-8,1e)的|f(x-epsilon/2)| > |f(x-epsilon)|
多个值epsilon
-9、1e-10等)。 - 如果要确保没有简单地接触零的根,请查找函数的极值,对于每个极值
x_e
,请检查的值f(x_e)
。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)