2014-09-05 108 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