scipy.optimize.elementwise.

bracket_root#

scipy.optimize.elementwise.bracket_root(f, xl0, xr0=None, *, xmin=None, xmax=None, factor=None, args=(), maxiter=1000)[source]#

括號單調實值實變數函數的根。

對於 f 輸出的每個元素,bracket_root 尋找純量括號端點 xlxr,使得 sign(f(xl)) == -sign(f(xr)) 逐元素成立。

如果函數是單調的,則保證此函數能找到有效的括號,但在其他條件下也可能找到括號。

xl0xr0xminxmaxfactorargs 的元素是(可相互廣播的)陣列時,此函數會逐元素運作。

參數:
f可呼叫物件 (callable)

要括號根的函數。簽名必須是

f(x: array, *args) -> array

其中 x 的每個元素都是有限實數,而 args 是一個元組,可能包含任意數量的可與 x 廣播的陣列。

f 必須是逐元素函數:對於所有索引 i,每個元素 f(x)[i] 必須等於 f(x[i])。它不得改變陣列 xargs 中的陣列。

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整數陣列

已執行的演算法迭代次數。

另請參閱

find_root

註解

此函數概括了在 scipy.stats 程式碼庫中各處找到的演算法。策略是迭代地擴展括號 (l, r),直到 f(l) < 0 < f(r)f(r) < 0 < f(l)。括號向左擴展如下。

  • 如果未提供 xmin,則 xl0l 之間的距離會以 factor 迭代增加。

  • 如果提供 xmin,則 xminl 之間的距離會以 factor 迭代減少。請注意,這也會增加括號大小。

括號向右擴展是類似的。

當端點不再是有限值、端點的函數值不再是有限值,或端點達到其限制值(xminxmax)時,括號在一個方向上的擴展會停止。當括號停止在兩個方向上擴展、括號包圍根,或找到根(偶然)時,迭代終止。

如果找到兩個括號 - 也就是說,在同一次迭代中在兩側都找到一個括號,則回傳較小的那個。

如果找到函數的根,則 xlxr 都會設定為最左邊的根。

範例

假設我們希望找到以下函數的根。

>>> 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_rootfind_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])