bracket_root#
- scipy.optimize.elementwise.bracket_root(f, xl0, xr0=None, *, xmin=None, xmax=None, factor=None, args=(), maxiter=1000)[source]#
为实变量的单调实值函数括定根。
对于 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
用于扩大括定的因子。参见说明。
- 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
算法执行的迭代次数。
另见
说明
此函数推广了
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])