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(字典)已在此函数调用前收集。

args元组, 可选

传递给目标函数及其导数(如果有)的额外参数。

method字符串, 可选

求解器类型。应为以下之一:

bracket: 2个浮点数的序列, 可选

包含根的区间。在两个端点上,f(x, *args) 必须具有不同的符号。

x0浮点数, 可选

初始猜测值。

x1浮点数, 可选

第二个猜测值。

fprime布尔值或可调用对象, 可选

如果 fprime 是布尔值且为 True,则假定 f 返回目标函数的值和导数。 fprime 也可以是返回 f 导数的可调用对象。在这种情况下,它必须接受与 f 相同的参数。

fprime2布尔值或可调用对象, 可选

如果 fprime2 是布尔值且为 True,则假定 f 返回目标函数的值以及一阶和二阶导数。 fprime2 也可以是返回 f 二阶导数的可调用对象。在这种情况下,它必须接受与 f 相同的参数。

xtol浮点数, 可选

终止的(绝对)容差。

rtol浮点数, 可选

终止的(相对)容差。

maxiter整数, 可选

最大迭代次数。

options字典, 可选

求解器选项的字典。例如,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)