2014-09-05 105 views
2

至于使用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的文档,我将补充说,当找到函数改变符号的区间时,这个算法是一般用于一维问题的推荐方法。

回答

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中尝试它,你会得到相同的行为。

+0

对于对称性你可能是对的:'scipy.optimize.brentq(lambda x:x ** 3,-9,1)'失败......谢谢! – Bach 2014-09-05 13:06:40