brenth#
- scipy.optimize.brenth(f, a, b, args=(), xtol=2e-12, rtol=8.881784197001252e-16, maxiter=100, full_output=False, disp=True)[原始碼]#
使用 Brent 雙曲線外插法在括號區間中尋找函數的根。
經典 Brent 常式的一個變體,用於尋找函數 f 在參數 a 和 b 之間的根,該變體使用雙曲線外插而不是反二次外插。Bus & Dekker (1975) 保證了此方法的收斂性,聲稱此處的函數評估次數上限是二分法的 4 或 5 倍。f(a) 和 f(b) 不能具有相同的符號。通常,與 brent 常式相當,但未經過大量測試。它是正割法的安全版本,使用雙曲線外插法。此處的版本由 Chuck Harris 提供,並實作 [BusAndDekker1975] 的演算法 M,其中可以找到更多詳細資訊(收斂性質、其他註解等)
- 參數:
- f函數
傳回數字的 Python 函數。f 必須是連續的,且 f(a) 和 f(b) 必須具有相反的符號。
- a純量
括號區間 [a,b] 的一端。
- b純量
括號區間 [a,b] 的另一端。
- xtol數字,選用
計算出的根
x0
將滿足np.allclose(x, x0, atol=xtol, rtol=rtol)
,其中x
是精確根。參數必須為正數。與brentq
相同,對於好的函數,此方法通常會滿足上述條件,且xtol/2
和rtol/2
。- rtol數字,選用
計算出的根
x0
將滿足np.allclose(x, x0, atol=xtol, rtol=rtol)
,其中x
是精確根。此參數不能小於其預設值4*np.finfo(float).eps
。與brentq
相同,對於好的函數,此方法通常會滿足上述條件,且xtol/2
和rtol/2
。- maxiter整數,選用
如果未在 maxiter 迭代次數內達到收斂,則會引發錯誤。必須 >= 0。
- args元組,選用
包含函數 f 的額外引數。f 由
apply(f, (x)+args)
呼叫。- full_output布林值,選用
如果 full_output 為 False,則傳回根。如果 full_output 為 True,則傳回值為
(x, r)
,其中 x 是根,而 r 是一個RootResults
物件。- disp布林值,選用
如果為 True,則在演算法未收斂時引發 RuntimeError。否則,收斂狀態會記錄在任何
RootResults
傳回物件中。
- 回傳:
- root浮點數
f 在 a 和 b 之間的根。
- r
RootResults
(如果full_output = True
則存在) 包含收斂相關資訊的物件。特別是,如果常式收斂,則
r.converged
為 True。
參見
fmin
,fmin_powell
,fmin_cg
,fmin_bfgs
,fmin_ncg
多變數局部最佳化器
leastsq
非線性最小平方法最小化器
fmin_l_bfgs_b
,fmin_tnc
,fmin_cobyla
受限多變數最佳化器
basinhopping
,differential_evolution
,brute
全域最佳化器
fminbound
,brent
,golden
,bracket
局部純量最小化器
fsolve
N-D 尋根
brentq
,ridder
,bisect
,newton
1-D 尋根
fixed_point
純量不動點尋找器
參考文獻
[BusAndDekker1975]Bus, J. C. P., Dekker, T. J., “Two Efficient Algorithms with Guaranteed Convergence for Finding a Zero of a Function”, ACM Transactions on Mathematical Software, Vol. 1, Issue 4, Dec. 1975, pp. 330-345. Section 3: “Algorithm M”. DOI:10.1145/355656.355659
範例
>>> def f(x): ... return (x**2 - 1)
>>> from scipy import optimize
>>> root = optimize.brenth(f, -2, 0) >>> root -1.0
>>> root = optimize.brenth(f, 0, 2) >>> root 1.0