本文簡要介紹 python 語言中 scipy.optimize.newton
的用法。
用法:
scipy.optimize.newton(func, x0, fprime=None, args=(), tol=1.48e-08, maxiter=50, fprime2=None, x1=None, rtol=0.0, full_output=False, disp=True)#
使用 Newton-Raphson(或正割法或哈雷法)求實函數或複函數的根。
給定附近的標量起點 x0,求 scalar-valued 函數 func 的根。如果提供了 func 的導數 fprime,則使用 Newton-Raphson 方法,否則使用割線方法。如果還提供了 func 的二階導數 fprime2,則使用哈雷法。
如果x0是一個包含多個項目的序列,
newton
返回一個數組:從每個(標量)起點開始的函數根x0.在這種情況下,函數必須矢量化以返回與其第一個參數相同形狀的序列或數組。如果fprime(fprime2) ,那麽它的返回也必須具有相同的形狀:每個元素都是一階(二階)導數函數關於在其第一個參數的每個元素處評估的唯一變量。newton
用於查找單個變量的scalar-valued 函數的根。對於涉及多個變量的問題,請參閱root
。- func: 可調用的
需要其根的函數。它必須是以下形式的單個變量的函數
f(x,a,b,c...)
,其中a,b,c...
是可以在參數範圍。- x0: 浮點數、序列或 ndarray
對根的初步估計應該接近實際根。如果不是標量,則 func 必須向量化並返回與其第一個參數形狀相同的序列或數組。
- fprime: 可調用的,可選的
可用且方便的函數的導數。如果它是無(默認),則使用割線法。
- args: 元組,可選
要在函數調用中使用的額外參數。
- tol: 浮點數,可選
根值的允許誤差。如果函數是complex-valued,一個更大的tol推薦作為實部和虛部x有助於
|x - x0|
.- maxiter: 整數,可選
最大迭代次數。
- fprime2: 可調用的,可選的
可用且方便時函數的二階導數。如果為無(默認),則使用普通的Newton-Raphson 或割線法。如果不是 None,則使用 Halley 方法。
- x1: 浮點數,可選
根的另一個估計值應該接近實際根。如果未提供 fprime,則使用。
- rtol: 浮點數,可選
終止公差(相對)。
- full_output: 布爾型,可選
如果full_output為 False(默認),則返回根。如果為真並且x0是標量,返回值為
(x, r)
,其中x
是根和r
是一個RootResults
目的。如果為真並且x0是非標量,返回值為(x, converged, zero_der)
(有關詳細信息,請參閱返回部分)。- disp: 布爾型,可選
如果為 True,如果算法沒有收斂,則引發 RuntimeError,錯誤消息包含迭代次數和當前函數值。否則,收斂狀態記錄在一個
RootResults
返回對象。忽略如果x0不是標量。注意:這與顯示無關,但是,`disp` 關鍵字不能重命名以實現向後兼容性。
- root: 浮點數、序列或 ndarray
函數為零的估計位置。
- r:
RootResults
,可選 呈現如果
full_output=True
和x0是標量。包含有關收斂信息的對象。特別是,r.converged
如果例程收斂,則為 True。- converged: bool的ndarray,可選
呈現如果
full_output=True
和x0是非標量的。對於向量函數,指示哪些元素成功收斂。- zero_der: bool的ndarray,可選
呈現如果
full_output=True
和x0是非標量的。對於向量函數,指示哪些元素具有零導數。
參數 ::
返回 ::
注意:
Newton-Raphson方法的收斂速度是二次的,哈雷方法是三次的,割線方法是sub-quadratic。這意味著,如果函數是well-behaved,則第 n 次迭代後估計根中的實際誤差大約是第 (n-1) 步後誤差的平方(對於 Halley 來說是立方)。然而,這裏使用的停止標準是步長,並不能保證找到根。因此,應驗證結果。更安全的算法有 brentq、brenth、ridder 和 bisect,但它們都要求根首先被括在函數改變符號的區間中。當找到這樣的區間時,建議將 brentq 算法一般用於一維問題。
當
newton
與數組一起使用時,它最適合解決以下類型的問題:初始猜測 x0 與根的距離都相對相同。
部分或全部額外參數 args 也是數組,因此可以一起解決一類類似問題。
初始猜測的大小 x0 大於 O(100) 個元素。否則,樸素循環的性能可能與向量一樣好或更好。
例子:
>>> import numpy as np >>> import matplotlib.pyplot as plt >>> from scipy import optimize
>>> def f(x): ... return (x**3 - 1) # only one real root at x = 1
fprime
未提供,使用割線法:>>> root = optimize.newton(f, 1.5) >>> root 1.0000000000000016 >>> root = optimize.newton(f, 1.5, fprime2=lambda x: 6 * x) >>> root 1.0000000000000016
僅提供
fprime
,使用Newton-Raphson方法:>>> root = optimize.newton(f, 1.5, fprime=lambda x: 3 * x**2) >>> root 1.0
fprime2
和fprime
都提供,使用哈雷法:>>> root = optimize.newton(f, 1.5, fprime=lambda x: 3 * x**2, ... fprime2=lambda x: 6 * x) >>> root 1.0
當我們想要找到一組相關起始值和/或函數參數的根時,我們可以將它們作為輸入數組提供:
>>> f = lambda x, a: x**3 - a >>> fder = lambda x, a: 3 * x**2 >>> rng = np.random.default_rng() >>> x = rng.standard_normal(100) >>> a = np.arange(-50, 50) >>> vec_res = optimize.newton(f, x, fprime=fder, args=(a, ), maxiter=200)
以上相當於在for-loop中分別求解
(x, a)
中的每個值,隻是更快:>>> loop_res = [optimize.newton(f, x0, fprime=fder, args=(a0,), ... maxiter=200) ... for x0, a0 in zip(x, a)] >>> np.allclose(vec_res, loop_res) True
繪製為
a
的所有值找到的結果:>>> analytical_result = np.sign(a) * np.abs(a)**(1/3) >>> fig, ax = plt.subplots() >>> ax.plot(a, analytical_result, 'o') >>> ax.plot(a, vec_res, '.') >>> ax.set_xlabel('$a$') >>> ax.set_ylabel('$x$ where $f(x, a)=0$') >>> plt.show()
相關用法
- Python SciPy optimize.newton_krylov用法及代碼示例
- Python SciPy optimize.nnls用法及代碼示例
- Python SciPy optimize.rosen_der用法及代碼示例
- Python SciPy optimize.line_search用法及代碼示例
- Python SciPy optimize.rosen用法及代碼示例
- Python SciPy optimize.shgo用法及代碼示例
- Python SciPy optimize.minimize_scalar用法及代碼示例
- Python SciPy optimize.root用法及代碼示例
- Python SciPy optimize.fmin用法及代碼示例
- Python SciPy optimize.NonlinearConstraint用法及代碼示例
- Python SciPy optimize.KrylovJacobian用法及代碼示例
- Python SciPy optimize.toms748用法及代碼示例
- Python SciPy optimize.linprog_verbose_callback用法及代碼示例
- Python SciPy optimize.bracket用法及代碼示例
- Python SciPy optimize.milp用法及代碼示例
- Python SciPy optimize.diagbroyden用法及代碼示例
- Python SciPy optimize.bisect用法及代碼示例
- Python SciPy optimize.isotonic_regression用法及代碼示例
- Python SciPy optimize.golden用法及代碼示例
- Python SciPy optimize.brute用法及代碼示例
- Python SciPy optimize.fsolve用法及代碼示例
- Python SciPy optimize.Bounds用法及代碼示例
- Python SciPy optimize.fixed_point用法及代碼示例
- Python SciPy optimize.rosen_hess用法及代碼示例
- Python SciPy optimize.broyden1用法及代碼示例
注:本文由純淨天空篩選整理自scipy.org大神的英文原創作品 scipy.optimize.newton。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。