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 的近似根
- r
RootResults
(如果full_output = True
則存在) 包含收斂資訊的物件。特別是,如果常式收斂,則
r.converged
為 True。
註解
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=1
或k=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