scipy.optimize.

broyden1#

scipy.optimize.broyden1(F, xin, iter=None, alpha=None, reduction_method='restart', max_rank=None, verbose=False, maxiter=None, f_tol=None, f_rtol=None, x_tol=None, x_rtol=None, tol_norm=None, line_search='armijo', callback=None, **kw)#

使用 Broyden 第一雅可比近似法尋找函數的根。

此方法也稱為「Broyden 好的方法」。

參數:
Ffunction(x) -> f

要尋找根的函數;應接受並返回類陣列物件。

xinarray_like

解的初始猜測

alphafloat, optional

雅可比矩陣的初始猜測為 (-1/alpha)

reduction_methodstr 或 tuple, optional

用於確保 Broyden 矩陣的秩保持較低的方法。可以是給定方法名稱的字串,或是 (method, param1, param2, ...) 形式的元組,給定方法名稱以及額外參數的值。

可用方法

  • restart:捨棄所有矩陣列。沒有額外參數。

  • simple:捨棄最舊的矩陣列。沒有額外參數。

  • svd:僅保留最重要的 SVD 成分。採用額外參數 to_retain,該參數決定在進行秩縮減時要保留的 SVD 成分數量。預設值為 max_rank - 2

max_rankint, optional

Broyden 矩陣的最大秩。預設值為無限大(即,不進行秩縮減)。

iterint, optional

要進行的迭代次數。如果省略(預設值),則盡可能多地進行迭代以達到容差。

verbosebool, optional

在每次迭代時將狀態列印到標準輸出。

maxiterint, optional

要進行的最大迭代次數。如果需要更多次才能達到收斂,則會引發 NoConvergence

f_tolfloat, optional

殘差的絕對容差(以最大範數表示)。如果省略,預設值為 6e-6。

f_rtolfloat, optional

殘差的相對容差。如果省略,則不使用。

x_tolfloat, optional

從雅可比近似法確定的絕對最小步長。如果步長小於此值,則最佳化將終止並視為成功。如果省略,則不使用。

x_rtolfloat, optional

相對最小步長。如果省略,則不使用。

tol_normfunction(vector) -> scalar, optional

用於收斂檢查的範數。預設值為最大範數。

line_search{None, ‘armijo’ (default), ‘wolfe’}, optional

要使用哪種類型的線搜索來確定雅可比近似法給定方向上的步長。預設為 ‘armijo’。

callbackfunction, optional

選用的回呼函數。它在每次迭代時都會被呼叫,形式為 callback(x, f),其中 x 是目前解,而 f 是對應的殘差。

返回:
solndarray

包含最終解的陣列(與 x0 類似的陣列類型)。

引發:
NoConvergence

當找不到解時。

另請參閱

root

多變數函數尋根演算法的介面。特別參見 method='broyden1'

註解

此演算法實作了逆雅可比準牛頓更新

\[H_+ = H + (dx - H df) dx^\dagger H / ( dx^\dagger H df)\]

對應於 Broyden 第一雅可比更新

\[J_+ = J + (df - J dx) dx^\dagger / dx^\dagger dx\]

參考文獻

[1]

B.A. van der Rotten, PhD thesis, “A limited memory Broyden method to solve high-dimensional systems of nonlinear equations”. Mathematisch Instituut, Universiteit Leiden, The Netherlands (2003). https://math.leidenuniv.nl/scripties/Rotten.pdf

範例

以下函數定義了一個非線性方程式系統

>>> def fun(x):
...     return [x[0]  + 0.5 * (x[0] - x[1])**3 - 1.0,
...             0.5 * (x[1] - x[0])**3 + x[1]]

可以透過以下方式獲得解。

>>> from scipy import optimize
>>> sol = optimize.broyden1(fun, [0, 0])
>>> sol
array([0.84116396, 0.15883641])