scipy.optimize.elementwise.

bracket_root#

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

为实变量的单调实值函数的根设置区间。

对于 f 的输出的每个元素,bracket_root 寻找标量区间端点 xlxr,使得 sign(f(xl)) == -sign(f(xr)) 按元素对应。

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

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

参数:
f可调用对象

要为其设置根区间的函数。签名必须是

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

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

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

xl0, xr0: float array_like

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

xmin, xmaxfloat array_like, 可选

区间的最小和最大允许端点,包括端点。必须可与所有其他数组输入广播。

factorfloat array_like,默认值:2

用于增长区间的因子。请参阅“注释”。

argsarray_like 元组,可选

要传递给 f 的其他位置数组参数。如果期望根的函数需要不可与 x 广播的参数,请用 f 包裹该函数,使得 f 仅接受 x 和可广播的 *args

maxiterint,默认值:1000

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

返回:
res_RichResult

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

successbool 数组

算法成功终止 (状态 0) 的位置的 True;否则为 False

statusint 数组

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

  • 0:算法生成了有效区间。

  • -1:区间扩展到允许的极限但未成功。

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

  • -3:遇到了非有限值。

  • -4:迭代被 callback 终止。

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

bracketfloat 数组的 2 元组

如果算法成功终止,则为区间的下端点和上端点。

f_bracketfloat 数组的 2 元组

fres.bracket 的端点处计算的值,分别为。

nfevint 数组

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

nitint 数组

执行的算法迭代次数。

另请参阅

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])