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,可选
传递给目标函数及其导数的额外参数。
- methodstr,可选
求解器类型。应为以下之一
- bracket: 2 个浮点数的序列,可选
一个包含根的区间。
f(x, *args)
在两个端点必须具有不同的符号。- x0float,可选
初始猜测值。
- x1float,可选
第二个猜测值。
- fprimebool 或 可调用对象,可选
如果 fprime 是布尔值且为 True,则假设 f 返回目标函数的值和导数。 fprime 也可以是返回 f 的导数的可调用对象。 在这种情况下,它必须接受与 f 相同的参数。
- fprime2bool 或 可调用对象,可选
如果 fprime2 是布尔值且为 True,则假设 f 返回目标函数的值以及一阶和二阶导数。 fprime2 也可以是返回 f 的二阶导数的可调用对象。 在这种情况下,它必须接受与 f 相同的参数。
- xtolfloat,可选
终止的容差(绝对)。
- rtolfloat,可选
终止的容差(相对)。
- maxiterint,可选
最大迭代次数。
- optionsdict,可选
求解器选项的字典。例如,
k
,有关详细信息,请参阅show_options()
。
- 返回:
- solRootResults
该解表示为
RootResults
对象。重要的属性是:root
解,converged
一个布尔标志,指示算法是否成功退出,flag
描述终止的原因。有关其他属性的描述,请参阅RootResults
。
另请参阅
show_options
求解器接受的其他选项
root
查找向量函数的根。
备注
本节介绍可由“method”参数选择的可用求解器。
默认设置是使用适用于所呈现情况的最佳方法。如果提供了区间,它可以使用其中一种区间方法。如果指定了导数和初始值,它可能会选择一种基于导数的方法。如果没有任何方法被判定为适用,它将引发异常。
每种方法的参数如下(x=必需,o=可选)。
方法
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)