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_args
和my_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
x
o
x
o
o
o
o
x
o
x
o
o
o
o
x
o
x
o
o
o
o
x
o
x
o
o
o
o
x
o
x
o
o
o
o
x
o
x
o
o
o
o
o
x
o
x
o
o
o
o
o
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)