scipy.optimize.

bracket#

scipy.optimize.bracket(func, xa=0.0, xb=1.0, args=(), grow_limit=110.0, maxiter=1000)[原始碼]#

括號標出函數的最小值。

給定一個函數和不同的初始點,在下坡方向(由初始點定義)搜尋,並傳回三個括住函數最小值的點。

參數:
funccallable f(x,*args)

要最小化的目標函數。

xa, xbfloat,選填

初始點。預設 xa 為 0.0,xb 為 1.0。局部最小值不一定包含在此區間內。

argstuple,選填

要傳遞給 func 的額外參數(如果存在)。

grow_limitfloat,選填

最大成長限制。預設為 110.0

maxiterint,選填

要執行的最大迭代次數。預設為 1000。

返回:
xa, xb, xcfloat

括號的最終點。

fa, fb, fcfloat

括號點的目標函數值。

funcallsint

進行的函數評估次數。

引發:
BracketError

如果在演算法終止之前找不到有效的括號。 有關有效括號的條件,請參閱註解。

註解

此演算法嘗試尋找三個嚴格排序的點(即 \(x_a < x_b < x_c\)\(x_c < x_b < x_a\)),滿足 \(f(x_b) ≤ f(x_a)\)\(f(x_b) ≤ f(x_c)\),其中一個不等式必須嚴格滿足,且所有 \(x_i\) 必須是有限的。

範例

此函數可以找到函數的向下凸區域

>>> import numpy as np
>>> import matplotlib.pyplot as plt
>>> from scipy.optimize import bracket
>>> def f(x):
...     return 10*x**2 + 3*x + 5
>>> x = np.linspace(-2, 2)
>>> y = f(x)
>>> init_xa, init_xb = 0.1, 1
>>> xa, xb, xc, fa, fb, fc, funcalls = bracket(f, xa=init_xa, xb=init_xb)
>>> plt.axvline(x=init_xa, color="k", linestyle="--")
>>> plt.axvline(x=init_xb, color="k", linestyle="--")
>>> plt.plot(x, y, "-k")
>>> plt.plot(xa, fa, "bx")
>>> plt.plot(xb, fb, "rx")
>>> plt.plot(xc, fc, "bx")
>>> plt.show()
../../_images/scipy-optimize-bracket-1_00_00.png

請注意,兩個初始點都在最小值的右側,而第三個點是在「下坡」方向找到的:函數似乎正在遞減(向左)的方向。 最終點是嚴格排序的,並且中間點的函數值小於端點的函數值;由此可見,最小值必定位於括號內。