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可调用

要查找其根的函数。

args元组,可选

传递给目标函数及其导数的额外自变量。

methodstr,可选

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

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

括住根的区间。在两个端点的 f(x, *args) 必需有不同的符号。

x0float,可选

初始猜测。

x1float,可选

第二个猜测。

fprimebool 或可调用,可选

如果 fprime 为布尔值并为真,则假设 f 返回目标函数和导数的值。fprime 还可以是返回 f 的导数的可调用函数。在这种情况下,它必须接受与 f 相同的自变量。

fprime2bool 或可调用,可选

如果 fprime2 为布尔值并为真,则假设 f 返回目标函数以及一阶和二阶导数的值。fprime2 还可以是返回 f 的二阶导数的可调用函数。在这种情况下,它必须接受与 f 相同的自变量。

xtolfloat,可选

终止的容差(绝对)。

rtolfloat,可选

终止的容差(相对)。

maxiterint,可选

最大迭代次数。

optionsdict,可选

求解程序选项的一个字典。例如,k,请参阅 show_options(),以了解详情。

返回:
solRootResults

表示为 RootResults 对象的解。重要的属性包括:root 解,converged 布尔标记,指示算法是否成功退出和 flag 描述终止原因。请参阅 RootResults,了解其他属性的说明。

另请参见

show_options

求解程序接受的其他选项

root

查找向量函数的一个根。

备注

此部分描述可通过“方法”参数选择的可用求解程序。

默认情况下,使用适用于所提供情况的最佳方法。如果提供了判定,它可能会使用一个判别方法。如果指定了导数和初始值,它可能会选择基于导数的方法之一。如果认为没有可适用的方法,它将引发一个异常。

每个方法的参数如下(x=必需,o=可选)。

方法

f

args

判定

x0

x1

fprime

fprime2

xtol

rtol

maxiter

选项

二分法

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

toms748

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)