作为使用scipy.optimize.brentq
的第一次尝试,我尝试了以下内容:
scipy.optimize.brentq(lambda x: x**3, -0.09, 0.01)
,输出
RuntimeError: Failed to converge after 100 iterations.
当然,我可以让它尝试更多的迭代,缩短间隔等等...但是,这是一个表现良好的函数,我在相对较小的时间间隔内使用了默认的迭代次数。在这些环境中期待解决方案是否太过分了?
我补充说,根据scipy的文档,当找到函数改变符号的区间时,建议使用此算法用于一维问题。
答案 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中尝试它,则会得到相同的行为。