scipy.optimize.

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/2rtol/2[Brent1973]

rtol數字,選用

計算出的根 x0 將滿足 np.allclose(x, x0, atol=xtol, rtol=rtol),其中 x 是精確根。該參數不能小於其預設值 4*np.finfo(float).eps。對於好的函數,布倫特方法通常會滿足上述條件,且 xtol/2rtol/2[Brent1973]

maxiter整數,選用

如果在 maxiter 迭代次數內未達到收斂,則會引發錯誤。必須 >= 0。

argstuple,選用

包含函數 f 的額外引數。fapply(f, (x)+args) 呼叫。

full_output布林值,選用

如果 full_output 為 False,則傳回根。如果 full_output 為 True,則傳回值為 (x, r),其中 x 是根,而 rRootResults 物件。

disp布林值,選用

如果為 True,則當演算法未收斂時引發 RuntimeError。否則,收斂狀態會記錄在任何 RootResults 傳回物件中。

傳回值:
root浮點數

fab 之間的根。

rRootResults (如果 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