查找标量函数的根。
参数:
f:callable寻找根源的函数。
args:tuple, 可选参数额外的参数传递给目标函数及其派生函数。
method:str, 可选参数bracket:A sequence of 2 floats, optional:用括号括起来的间隔。 f(x,* args)在两个端点处必须具有不同的符号。
x0:float, 可选参数初步猜测。
x1:float, 可选参数第二个猜测。
fprime:bool 或 callable, 可选参数如果fprime是布尔值且为True,则假定f返回目标函数和导数的值。 fprime也可以是可调用的返回f的导数。在这种情况下,它必须接受与f相同的参数。
fprime2:bool 或 callable, 可选参数如果fprime2是布尔值且为True,则假定f返回目标函数以及一阶和二阶导数的值。 fprime2也可以是可调用的,返回f的二阶导数。在这种情况下,它必须接受与f相同的参数。
xtol:float, 可选参数终止的公差(绝对值)。
rtol:float, 可选参数终止的公差(相对)。
maxiter:int, 可选参数最大迭代次数。
options:dict, 可选参数求解器选项字典。例如。k,请参阅show_options()有关详细信息。
返回值:
sol:根结果解决方案表示为RootResults Object 。重要属性是:root解决方案 ,converged一个布尔标志,指示算法是否成功退出,以及flag描述终止的原因。看到RootResults用于其他属性的描述。
注意:
本节介绍可以通过‘method’参数选择的可用求解器。
默认情况是针对出现的情况使用最佳方法。如果提供了括号,则可以使用其中一种包围方法。如果指定了导数和初始值,则可以选择基于导数的方法之一。如果判定没有方法适用,则将引发Exception。
例子:
找到简单三次方的根
>>> 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)