scipy.optimize.

root_scalar#

scipy.optimize.root_scalar(f, args=(), method=None, bracket=None, fprime=None, fprime2=None, x0=None, x1=None, xtol=None, rtol=None, maxiter=None, options=None)[原始碼]#

尋找純量函數的根。

參數:
f可呼叫物件

要尋找根的函數。

假設可呼叫物件具有簽名 f0(x, *my_args, **my_kwargs),其中 my_argsmy_kwargs 是必要的位置和關鍵字引數。與其傳遞 f0 作為可呼叫物件,不如將其包裝起來以僅接受 x;例如,傳遞 fun=lambda x: f0(x, *my_args, **my_kwargs) 作為可呼叫物件,其中 my_args (元組) 和 my_kwargs (字典) 已在此函數調用之前收集。

argstuple, optional

傳遞給目標函數及其導數的可選額外引數。

methodstr, optional

求解器的類型。應為下列其中之一

bracket: 2 個浮點數的序列,可選

括住根的區間。f(x, *args) 在兩個端點必須有不同的符號。

x0float, optional

初始猜測值。

x1float, optional

第二個猜測值。

fprimebool 或可呼叫物件, optional

如果 fprime 是布林值且為 True,則假設 f 會傳回目標函數的值和導數。fprime 也可以是傳回 f 導數的可呼叫物件。在這種情況下,它必須接受與 f 相同的引數。

fprime2bool 或可呼叫物件, optional

如果 fprime2 是布林值且為 True,則假設 f 會傳回目標函數的值以及一階和二階導數。fprime2 也可以是傳回 f 二階導數的可呼叫物件。在這種情況下,它必須接受與 f 相同的引數。

xtolfloat, optional

終止的容差 (絕對)。

rtolfloat, optional

終止的容差 (相對)。

maxiterint, optional

最大迭代次數。

optionsdict, optional

求解器選項的字典。例如,k,請參閱 show_options() 以取得詳細資訊。

返回:
solRootResults

RootResults 物件表示的解。重要的屬性為:root 解、converged 布林旗標,指示演算法是否成功退出,以及 flag,描述終止的原因。請參閱 RootResults 以取得其他屬性的描述。

另請參閱

show_options

求解器接受的其他選項

root

尋找向量函數的根。

註解

本節描述可透過 ‘method’ 參數選取的可用求解器。

預設是使用適用於所呈現情況的最佳方法。如果提供括號,則可能會使用其中一種括號方法。如果指定了導數和初始值,則可能會選擇其中一種基於導數的方法。如果判斷沒有適用的方法,則會引發例外。

每種方法的引數如下 (x=必要, o=可選)。

method

f

args

bracket

x0

x1

fprime

fprime2

xtol

rtol

maxiter

options

bisect

x

o

x

o

o

o

o

brentq

x

o

x

o

o

o

o

brenth

x

o

x

o

o

o

o

ridder

x

o

x

o

o

o

o

toms748

x

o

x

o

o

o

o

secant

x

o

x

o

o

o

o

o

newton

x

o

x

o

o

o

o

o

halley

x

o

x

x

x

o

o

o

o

範例

尋找簡單三次方程式的根

>>> from scipy import optimize
>>> def f(x):
...     return (x**3 - 1)  # only one real root at x = 1
>>> def fprime(x):
...     return 3*x**2

brentq 方法將括號作為輸入

>>> sol = optimize.root_scalar(f, bracket=[0, 3], method='brentq')
>>> sol.root, sol.iterations, sol.function_calls
(1.0, 10, 11)

newton 方法將單個點作為輸入並使用導數。

>>> sol = optimize.root_scalar(f, x0=0.2, fprime=fprime, method='newton')
>>> sol.root, sol.iterations, sol.function_calls
(1.0, 11, 22)

該函數可以在單次調用中提供值和導數。

>>> def f_p_pp(x):
...     return (x**3 - 1), 3*x**2, 6*x
>>> sol = optimize.root_scalar(
...     f_p_pp, x0=0.2, fprime=True, method='newton'
... )
>>> sol.root, sol.iterations, sol.function_calls
(1.0, 11, 11)
>>> sol = optimize.root_scalar(
...     f_p_pp, x0=0.2, fprime=True, fprime2=True, method='halley'
... )
>>> sol.root, sol.iterations, sol.function_calls
(1.0, 7, 8)