brentq#
- scipy.optimize.brentq(f, a, b, args=(), xtol=2e-12, rtol=8.881784197001252e-16, maxiter=100, full_output=False, disp=True)[原始碼]#
使用布倫特方法在括號區間中尋找函數的根。
使用經典的布倫特方法在符號變更區間 [a, b] 上尋找函數 f 的根。通常被認為是此處最佳的尋根常式。它是正割法的安全版本,使用反二次外插法。布倫特方法結合了根括號、區間二分法和反二次插值。它有時被稱為 van Wijngaarden-Dekker-Brent 方法。布倫特 (1973) 聲稱保證了在 [a,b] 內可計算函數的收斂性。
[Brent1973] 提供了該演算法的經典描述。另一個描述可以在最新版的 Numerical Recipes 中找到,包括 [PressEtal1992]。第三個描述位於 http://mathworld.wolfram.com/BrentsMethod.html。只需閱讀我們的程式碼就應該很容易理解該演算法。我們的程式碼與標準呈現方式略有不同:我們為外插步驟選擇了不同的公式。
- 參數:
- f函數
傳回數字的 Python 函數。函數 \(f\) 必須是連續的,且 \(f(a)\) 和 \(f(b)\) 必須具有相反的符號。
- a純量
括號區間 \([a, b]\) 的一端。
- b純量
括號區間 \([a, b]\) 的另一端。
- xtol數字,選用
計算出的根
x0
將滿足np.allclose(x, x0, atol=xtol, rtol=rtol)
,其中x
是精確根。參數必須為正數。對於好的函數,布倫特方法通常會滿足上述條件,且xtol/2
和rtol/2
。[Brent1973]- rtol數字,選用
計算出的根
x0
將滿足np.allclose(x, x0, atol=xtol, rtol=rtol)
,其中x
是精確根。該參數不能小於其預設值4*np.finfo(float).eps
。對於好的函數,布倫特方法通常會滿足上述條件,且xtol/2
和rtol/2
。[Brent1973]- maxiter整數,選用
如果在 maxiter 迭代次數內未達到收斂,則會引發錯誤。必須 >= 0。
- argstuple,選用
包含函數 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 尋根
brenth
,ridder
,bisect
,newton
1-D 尋根
fixed_point
純量不動點尋找器
註解
f 必須是連續的。f(a) 和 f(b) 必須具有相反的符號。
參考文獻
[Brent1973] (1,2,3)Brent, R. P., Algorithms for Minimization Without Derivatives. Englewood Cliffs, NJ: Prentice-Hall, 1973. Ch. 3-4.
[PressEtal1992]Press, W. H.; Flannery, B. P.; Teukolsky, S. A.; and Vetterling, W. T. Numerical Recipes in FORTRAN: The Art of Scientific Computing, 第 2 版。Cambridge, England: Cambridge University Press, pp. 352-355, 1992. 第 9.3 節:「Van Wijngaarden-Dekker-Brent 方法」。
範例
>>> def f(x): ... return (x**2 - 1)
>>> from scipy import optimize
>>> root = optimize.brentq(f, -2, 0) >>> root -1.0
>>> root = optimize.brentq(f, 0, 2) >>> root 1.0