bracket_root#
- scipy.optimize.elementwise.bracket_root(f, xl0, xr0=None, *, xmin=None, xmax=None, factor=None, args=(), maxiter=1000)[源代码]#
为实变量的单调实值函数的根设置区间。
对于 f 的输出的每个元素,
bracket_root
寻找标量区间端点xl
和xr
,使得sign(f(xl)) == -sign(f(xr))
按元素对应。如果函数是单调的,则保证该函数找到有效区间,但在其他条件下也可能找到区间。
当 xl0、xr0、xmin、xmax、factor 和 args 的元素是(可相互广播的)数组时,此函数按元素对应工作。
- 参数:
- f可调用对象
要为其设置根区间的函数。签名必须是
f(x: array, *args) -> array
其中
x
的每个元素都是有限实数,并且args
是一个元组,其中可能包含任意数量的可与x
广播的数组。f 必须是一个逐元素函数:对于所有索引
i
,每个元素f(x)[i]
必须等于f(x[i])
。它不得改变数组x
或args
中的数组。- 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 元组
f 在
res.bracket
的端点处计算的值,分别为。- nfevint 数组
为找到根而计算 f 的横坐标的数量。这与 f 的调用次数不同,因为该函数可能在一次调用中在多个点进行评估。
- nitint 数组
执行的算法迭代次数。
另请参阅
注释
此函数概括了在整个
scipy.stats
代码库中零散找到的算法。策略是迭代地增长区间 (l, r),直到f(l) < 0 < f(r)
或f(r) < 0 < f(l)
。区间按如下方式向左增长。如果未提供 xmin,则 xl0 和 l 之间的距离会迭代地增加 factor。
如果提供了 xmin,则 xmin 和 l 之间的距离会迭代地减少 factor。请注意,这也会增加区间大小。
区间向右的增长是类似的。
当端点不再是有限的、端点处的函数值不再是有限的或端点达到其极限值(xmin 或 xmax)时,一个方向上区间的增长停止。当区间在两个方向都停止增长、区间包围根或(偶然)找到根时,迭代终止。
如果找到两个区间 - 即,在同一次迭代中在两侧都找到了区间,则返回较小的区间。
如果找到函数的根,则 xl 和 xr 都将设置为最左边的根。
示例
假设我们希望找到以下函数的根。
>>> 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_root
和find_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])