bracket_root#
- scipy.optimize.elementwise.bracket_root(f, xl0, xr0=None, *, xmin=None, xmax=None, factor=None, args=(), maxiter=1000)[source]#
括號單調實值實變數函數的根。
對於 f 輸出的每個元素,
bracket_root
尋找純量括號端點xl
和xr
,使得sign(f(xl)) == -sign(f(xr))
逐元素成立。如果函數是單調的,則保證此函數能找到有效的括號,但在其他條件下也可能找到括號。
當 xl0、xr0、xmin、xmax、factor 和 args 的元素是(可相互廣播的)陣列時,此函數會逐元素運作。
- 參數:
- f可呼叫物件 (callable)
要括號根的函數。簽名必須是
f(x: array, *args) -> array
其中
x
的每個元素都是有限實數,而args
是一個元組,可能包含任意數量的可與x
廣播的陣列。f 必須是逐元素函數:對於所有索引
i
,每個元素f(x)[i]
必須等於f(x[i])
。它不得改變陣列x
或args
中的陣列。- xl0, xr0: 浮點數 類陣列
括號的起始猜測值,不一定包含根。如果未提供 xr0,則
xr0 = xl0 + 1
。必須可與所有其他陣列輸入廣播。- xmin, xmax浮點數 類陣列,選用
括號的最小和最大允許端點,包含端點本身。必須可與所有其他陣列輸入廣播。
- factor浮點數 類陣列,預設值:2
用於擴展括號的因子。請參閱「註解」。
- args類陣列的元組,選用
要傳遞給 f 的其他位置陣列引數。如果需要根的可呼叫物件需要不可與 x 廣播的引數,請使用 f 包裝該可呼叫物件,使 f 僅接受 x 和可廣播的
*args
。- maxiter整數,預設值:1000
要執行的演算法最大迭代次數。
- 回傳值:
- res_RichResult
一個類似於
scipy.optimize.OptimizeResult
實例的物件,具有以下屬性。描述的撰寫方式如同值將為純量;但是,如果 f 回傳陣列,則輸出將為相同形狀的陣列。- success布林值陣列
True
,演算法成功終止 (狀態0
) 的位置;否則為False
。- status整數陣列
表示演算法結束狀態的整數。
0
:演算法產生有效的括號。-1
:括號擴展到允許的限制但未成功。-2
:已達到最大迭代次數。-3
:遇到非有限值。-4
:迭代被 callback 終止。-5
:初始括號不滿足 `xmin <= xl0 < xr0 < xmax`。
- bracket浮點數陣列的 2 元組
括號的下限和上限端點,如果演算法成功終止。
- f_bracket浮點數陣列的 2 元組
分別在
res.bracket
端點評估的 f 值。- nfev整數陣列
為了找到根而評估 f 的橫坐標數。這與 f 被呼叫的次數不同,因為函數可能在單次呼叫中在多個點進行評估。
- nit整數陣列
已執行的演算法迭代次數。
另請參閱
註解
此函數概括了在
scipy.stats
程式碼庫中各處找到的演算法。策略是迭代地擴展括號 (l, r),直到f(l) < 0 < f(r)
或f(r) < 0 < f(l)
。括號向左擴展如下。如果未提供 xmin,則 xl0 和 l 之間的距離會以 factor 迭代增加。
如果提供 xmin,則 xmin 和 l 之間的距離會以 factor 迭代減少。請注意,這也會增加括號大小。
括號向右擴展是類似的。
當端點不再是有限值、端點的函數值不再是有限值,或端點達到其限制值(xmin 或 xmax)時,括號在一個方向上的擴展會停止。當括號停止在兩個方向上擴展、括號包圍根,或找到根(偶然)時,迭代終止。
如果找到兩個括號 - 也就是說,在同一次迭代中在兩側都找到一個括號,則回傳較小的那個。
如果找到函數的根,則 xl 和 xr 都會設定為最左邊的根。
範例
假設我們希望找到以下函數的根。
>>> def f(x, c=5): ... return x**3 - 2*x - c
首先,我們必須找到有效的括號。該函數不是單調的,但
bracket_root
可能能夠提供一個括號。>>> from scipy.optimize import elementwise >>> res_bracket = elementwise.bracket_root(f, 0) >>> res_bracket.success True >>> res_bracket.bracket (2.0, 4.0)
實際上,函數在括號端點的值具有相反的符號。
>>> res_bracket.f_bracket (-1.0, 51.0)
一旦我們有了有效的括號,就可以使用
find_root
來提供精確的根。>>> res_root = elementwise.find_root(f, res_bracket.bracket) >>> res_root.x 2.0945514815423265
bracket_root
和find_root
接受大多數引數的陣列。例如,要一次找到參數c
的幾個值的根>>> import numpy as np >>> c = np.asarray([3, 4, 5]) >>> res_bracket = elementwise.bracket_root(f, 0, args=(c,)) >>> res_bracket.bracket (array([1., 1., 2.]), array([2., 2., 4.])) >>> res_root = elementwise.find_root(f, res_bracket.bracket, args=(c,)) >>> res_root.x array([1.8932892 , 2. , 2.09455148])