scipy.optimize.brentq在简单情况下无法收敛
作为第一次尝试使用 scipy.optimize.brentq
,我试了以下代码:
scipy.optimize.brentq(lambda x: x**3, -0.09, 0.01)
然后输出结果是:
RuntimeError: Failed to converge after 100 iterations.
当然,我可以让它尝试更多的迭代,缩短区间等等……不过,这个函数的表现很好,我在一个相对较小的区间内使用了默认的迭代次数。在这种情况下,期待能找到解决方案是不是有点过分?
我还想补充一下,根据scipy的文档,这个算法是推荐用于一维问题的一般用途,前提是已经找到了函数改变符号的区间。
1 个回答
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
而且,它在两次迭代中得到了这个解:
(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的Brent方法实现没有问题。如果你在Mathematica中尝试,也会得到相同的结果。