scipy.optimize.elementwise.

bracket_root#

scipy.optimize.elementwise.bracket_root(f, xl0, xr0=None, *, xmin=None, xmax=None, factor=None, args=(), maxiter=1000)[source]#

为实变量的单调实值函数括定根。

对于 f 输出的每个元素,bracket_root 寻找标量括定端点 xlxr,使得 sign(f(xl)) == -sign(f(xr)) 逐元素成立。

如果函数是单调的,则保证此函数能找到有效的括定,但在其他条件下也可能找到括定。

xl0xr0xminxmaxfactorargs 的元素是(相互可广播的)数组时,此函数逐元素工作。

参数:
f可调用对象

要括定根的函数。其签名必须是

f(x: array, *args) -> array

其中 x 的每个元素都是有限实数,args 是一个元组,可能包含任意数量与 x 可广播的数组。

f 必须是逐元素函数:对于所有索引 if(x)[i] 必须等于 f(x[i])。它不得更改数组 xargs 中的数组。

xl0, xr0: float array_like

括定的起始猜测,无需包含根。如果未提供 xr0,则 xr0 = xl0 + 1。必须与所有其他数组输入可广播。

xmin, xmaxfloat array_like, 可选

括定的最小和最大允许端点(包含)。必须与所有其他数组输入可广播。

factorfloat array_like, 默认值: 2

用于扩大括定的因子。参见说明。

argstuple of array_like, 可选

要传递给 f 的其他位置数组参数。如果需要求根的可调用对象需要与 x 不可广播的参数,则用 f 包装该可调用对象,使得 f 仅接受 x 和可广播的 *args

maxiterint, 默认值: 1000

算法执行的最大迭代次数。

返回:
res_RichResult

一个类似于 scipy.optimize.OptimizeResult 实例的对象,具有以下属性。描述假定值为标量;但是,如果 f 返回一个数组,则输出将是相同形状的数组。

successbool array

如果算法成功终止(状态码 0)则为 True;否则为 False

statusint array

表示算法退出状态的整数。

  • 0 : 算法产生了有效的括定。

  • -1 : 括定扩展到允许的限制但未成功。

  • -2 : 达到最大迭代次数。

  • -3 : 遇到非有限值。

  • -4 : 迭代被 callback 终止。

  • -5: 初始括定不满足 `xmin <= xl0 < xr0 < xmax`。

bracket2-tuple of float arrays

括定的下限和上限端点,如果算法成功终止。

f_bracket2-tuple of float arrays

分别在 res.bracket 的端点处评估 f 的值。

nfevint array

为找到根而评估 f 的横坐标数量。这与 f调用的次数不同,因为函数在一次调用中可能在多个点进行评估。

nitint array

算法执行的迭代次数。

另见

find_root

说明

此函数推广了 scipy.stats 代码库中零散的算法。其策略是迭代地扩大括定 (l, r),直到 f(l) < 0 < f(r)f(r) < 0 < f(l)。括定向左扩展如下。

  • 如果未提供 xmin,则 xl0l 之间的距离会以 factor 迭代增加。

  • 如果提供了 xmin,则 xminl 之间的距离会以 factor 迭代减小。请注意,这也会增加括定的大小。

括定向右扩展是类似的。

括定在某个方向上的扩展会在以下情况停止:端点不再有限,端点处的函数值不再有限,或端点达到其限制值(xminxmax)。当括定在两个方向上都停止增长,或括定包围根,或偶然找到根时,迭代终止。

如果找到两个括定——即在同一次迭代中在两侧都找到了括定,则返回其中较小的一个。

如果找到函数的根,则 xlxr 都设置为最左侧的根。

示例

假设我们希望找到以下函数的根。

>>> def f(x, c=5):
...     return x**3 - 2*x - c

首先,我们必须找到一个有效的括定。函数不是单调的,但 bracket_root 可能能够提供一个括定。

>>> from scipy.optimize import elementwise
>>> res_bracket = elementwise.bracket_root(f, 0)
>>> res_bracket.success
True
>>> res_bracket.bracket
(2.0, 4.0)

确实,函数在括定端点处的值符号相反。

>>> res_bracket.f_bracket
(-1.0, 51.0)

一旦我们有了有效的括定,就可以使用 find_root 来提供精确的根。

>>> res_root = elementwise.find_root(f, res_bracket.bracket)
>>> res_root.x
2.0945514815423265

bracket_rootfind_root 接受数组作为大多数参数。例如,要一次找到参数 c 的几个值的根:

>>> import numpy as np
>>> c = np.asarray([3, 4, 5])
>>> res_bracket = elementwise.bracket_root(f, 0, args=(c,))
>>> res_bracket.bracket
(array([1., 1., 2.]), array([2., 2., 4.]))
>>> res_root = elementwise.find_root(f, res_bracket.bracket, args=(c,))
>>> res_root.x
array([1.8932892 , 2.        , 2.09455148])