scipy.optimize.brentq无法收敛于一个简单的案例

时间:2014-09-05 11:10:39

标签: python scipy

作为使用scipy.optimize.brentq的第一次尝试,我尝试了以下内容:

scipy.optimize.brentq(lambda x: x**3, -0.09, 0.01)

,输出

RuntimeError: Failed to converge after 100 iterations.

当然,我可以让它尝试更多的迭代,缩短间隔等等...但是,这是一个表现良好的函数,我在相对较小的时间间隔内使用了默认的迭代次数。在这些环境中期待解决方案是否太过分了?

我补充说,根据scipy的文档,当找到函数改变符号的区间时,建议使用此算法用于一维问题。

1 个答案:

答案 0 :(得分:3)

只有只是失败

scipy.optimize.brentq(lambda x: x**3, -0.09, 0.01,maxiter=105)

给出

-1.3399668957297373e-13

如果你选择这个更大的间隔,它会很有效,所以你选择了一个小间隔的事实并没有让它变得更容易:

scipy.optimize.brentq(lambda x: x**3, -1, 1)

给出

0

此外,它在2次迭代中得到了这个解决方案:

(re,obj) = scipy.optimize.brentq(lambda x: x**3, -1, 1,full_output=True)
obj.iterations

给出

2
但是,我怀疑这是因为根位于所选区间的中点。如果我们打破间隔的对称性,事情就不那么好了

(re,obj) = scipy.optimize.brentq(lambda x: x**3, -0.99, 1,full_output=True,maxiter=200)
obj.iterations

给出

115

我认为问题在于x ^ 3的根也是一个拐点,许多根查找算法在这种情况下都有问题。

请注意,scipy实施布伦特方法没有任何问题。例如,如果您在Mathematica中尝试它,则会得到相同的行为。