scipy.optimize.

toms748#

scipy.optimize.toms748(f, a, b, args=(), k=1, xtol=2e-12, rtol=8.881784197001252e-16, maxiter=100, full_output=False, disp=True)[source]#

使用 TOMS 演算法 748 方法尋找根。

實作 Alefeld、Potro 和 Shi 的演算法 748 方法,以在區間 [a , b] 上尋找函數 f 的根,其中 f(a)f(b) 必須具有相反的符號。

它混合使用了反三次插值和「牛頓-二次」步驟。[APS1995]。

參數:
f函數

返回純量的 Python 函數。函數 \(f\) 必須是連續的,且 \(f(a)\)\(f(b)\) 具有相反的符號。

a純量,

搜尋區間的下邊界

b純量,

搜尋區間的上邊界

argstuple, optional

包含函數 f 的額外參數。f 通過 f(x, *args) 呼叫。

kint, optional

每次迭代要執行的牛頓二次步驟數。k>=1

xtol純量, optional

計算出的根 x0 將滿足 np.allclose(x, x0, atol=xtol, rtol=rtol),其中 x 是精確根。參數必須為正數。

rtol純量, optional

計算出的根 x0 將滿足 np.allclose(x, x0, atol=xtol, rtol=rtol),其中 x 是精確根。

maxiterint, optional

如果在 maxiter 次迭代中未達到收斂,則會引發錯誤。必須 >= 0。

full_outputbool, optional

如果 full_output 為 False,則返回根。如果 full_output 為 True,則傳回值為 (x, r),其中 x 是根,而 r 是一個 RootResults 物件。

dispbool, optional

如果為 True,則在演算法未收斂時引發 RuntimeError。否則,收斂狀態會記錄在 RootResults 返回物件中。

返回:
rootfloat

函數 f 的近似根

rRootResults (如果 full_output = True 則存在)

包含收斂資訊的物件。特別是,如果常式收斂,則 r.converged 為 True。

參見

brentq, brenth, ridder, bisect, newton
fsolve

尋找 N 維度的根。

註解

f 必須是連續的。演算法 748 與 k=2 在漸近意義上是已知最有效率的演算法,用於尋找四次連續可微函數的根。與 Brent 演算法 (可能僅在最後一步減少封閉區間的長度) 相反,演算法 748 在每次迭代中都會減少它,並具有與尋找根相同的漸近效率。

為了易於陳述效率指標,假設 f 具有 4 個連續導數。對於 k=1,收斂階數至少為 2.7,並且每次迭代約有 2 個函數評估,效率指標約為 1.65。對於 k=2,階數約為 4.6,每次迭代漸近地進行 3 個函數評估,效率指標為 1.66。對於更高的 k 值,效率指標接近 (3k-2) 的 k 次根,因此 k=1k=2 通常是適當的。

參考文獻

[APS1995]

Alefeld, G. E. and Potra, F. A. and Shi, Yixun, Algorithm 748: Enclosing Zeros of Continuous Functions, ACM Trans. Math. Softw. Volume 221(1995) doi = {10.1145/210089.210111}

範例

>>> def f(x):
...     return (x**3 - 1)  # only one real root at x = 1
>>> from scipy import optimize
>>> root, results = optimize.toms748(f, 0, 2, full_output=True)
>>> root
1.0
>>> results
      converged: True
           flag: converged
 function_calls: 11
     iterations: 5
           root: 1.0
         method: toms748