broyden2#
- scipy.optimize.broyden2(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 第二種 Jacobian 近似法尋找函數的根。
此方法也稱為 “Broyden 的壞方法”。
- 參數:
- Ffunction(x) -> f
要尋找根的函數;應接受並返回類陣列物件。
- xinarray_like
解的初始猜測
- alphafloat,選用
Jacobian 的初始猜測為
(-1/alpha)
。- reduction_methodstr 或 tuple,選用
用於確保 Broyden 矩陣的秩保持較低的方法。可以是給出方法名稱的字串,或是
(method, param1, param2, ...)
形式的 tuple,其中給出方法名稱和額外參數的值。可用方法
restart
:捨棄所有矩陣列。沒有額外參數。simple
:捨棄最舊的矩陣列。沒有額外參數。svd
:僅保留最重要的 SVD 成分。接受一個額外參數to_retain
,用於決定在執行秩縮減時要保留的 SVD 成分數量。預設值為max_rank - 2
。
- max_rankint,選用
Broyden 矩陣的最大秩。預設值為無限大(即,不進行秩縮減)。
- iterint,選用
要進行的迭代次數。如果省略(預設),則會進行達到容差所需的次數。
- verbosebool,選用
在每次迭代時將狀態列印到 stdout。
- maxiterint,選用
要進行的最大迭代次數。如果需要更多次才能達到收斂,則會引發
NoConvergence
。- f_tolfloat,選用
殘差的絕對容差(以最大範數表示)。如果省略,預設值為 6e-6。
- f_rtolfloat,選用
殘差的相對容差。如果省略,則不使用。
- x_tolfloat,選用
絕對最小步長大小,由 Jacobian 近似值決定。如果步長大小小於此值,則最佳化會終止並視為成功。如果省略,則不使用。
- x_rtolfloat,選用
相對最小步長大小。如果省略,則不使用。
- tol_normfunction(vector) -> scalar,選用
用於收斂檢查的範數。預設值為最大範數。
- line_search{None, ‘armijo’ (預設), ‘wolfe’},選用
要使用哪種類型的線搜索來決定 Jacobian 近似值給定方向上的步長大小。預設為 ‘armijo’。
- callbackfunction,選用
選用回呼函數。它在每次迭代時都會以
callback(x, f)
的形式呼叫,其中 x 是目前解,而 f 是對應的殘差。
- 傳回值:
- solndarray
一個陣列(與 x0 具有相似的陣列類型),包含最終解。
- 引發:
- NoConvergence
當找不到解時。
另請參閱
root
多變數函數尋根演算法的介面。特別參閱
method='broyden2'
。
註解
此演算法實作了反 Jacobian 擬牛頓更新
\[H_+ = H + (dx - H df) df^\dagger / ( df^\dagger df)\]對應於 Broyden 的第二種方法。
參考文獻
[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://web.archive.org/web/20161022015821/http://www.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.broyden2(fun, [0, 0]) >>> sol array([0.84116365, 0.15883529])