scipy.optimize.

brenth#

scipy.optimize.brenth(f, a, b, args=(), xtol=2e-12, rtol=np.float64(8.881784197001252e-16), maxiter=100, full_output=False, disp=True)[源代码]#

使用带有双曲线外推法的布伦特方法在区间内查找函数的根。

经典布伦特例程的一个变体,用于在参数 a 和 b 之间查找函数 f 的根,它使用双曲线外推法而不是逆二次外推法。Bus & Dekker (1975) 保证此方法的收敛性,声称函数评估的上限是二分法的 4 或 5 倍。f(a) 和 f(b) 不能具有相同的符号。通常与布伦特例程不相上下,但未经大量测试。它是割线法的一个安全版本,使用双曲线外推法。此版本由 Chuck Harris 编写,实现了 [BusAndDekker1975] 中的算法 M,其中可以找到更多详细信息(收敛特性、补充说明等)。

参数:
f函数

返回数字的 Python 函数。f 必须是连续的,且 f(a) 和 f(b) 必须具有相反的符号。

a标量

包围区间 [a,b] 的一端。

b标量

包围区间 [a,b] 的另一端。

xtol数字,可选

计算出的根 x0 将满足 np.isclose(x, x0, atol=xtol, rtol=rtol),其中 x 是精确的根。此参数必须为正。与 brentq 一样,对于好的函数,该方法通常会以 xtol/2rtol/2 满足上述条件。

rtol数字,可选

计算出的根 x0 将满足 np.isclose(x, x0, atol=xtol, rtol=rtol),其中 x 是精确的根。此参数不能小于其默认值 4*np.finfo(float).eps。与 brentq 一样,对于好的函数,该方法通常会以 xtol/2rtol/2 满足上述条件。

maxiter整数,可选

如果在 maxiter 次迭代内未实现收敛,则会引发错误。必须 >= 0。

args元组,可选

包含函数 f 的额外参数。f 通过 apply(f, (x)+args) 调用。

full_output布尔值,可选

如果 full_output 为 False,则返回根。如果 full_output 为 True,则返回值为 (x, r),其中 x 是根,r 是一个 RootResults 对象。

disp布尔值,可选

如果为 True,则在算法未收敛时引发 RuntimeError。否则,收敛状态将记录在任何 RootResults 返回对象中。

返回:
root浮点数

fab 之间的根。

rRootResults (如果 full_output = True 则存在)

包含收敛信息的对象。特别是,如果例程收敛,则 r.converged 为 True。

另请参阅

fmin, fmin_powell, fmin_cg, fmin_bfgs, fmin_ncg

多元局部优化器

leastsq

非线性最小二乘法极小化器

fmin_l_bfgs_b, fmin_tnc, fmin_cobyla

受约束的多元优化器

basinhopping, differential_evolution, brute

全局优化器

fminbound, brent, golden, bracket

局部标量极小化器

fsolve

N维求根

brentq, ridder, bisect, newton

一维求根

fixed_point

标量不动点查找器

elementwise.find_root

高效的逐元素一维求根器

注意

如参数文档中所述,计算出的根 x0 将满足 np.isclose(x, x0, atol=xtol, rtol=rtol),其中 x 是精确的根。用方程形式表示,此终止条件为 abs(x - x0) <= xtol + rtol * abs(x0)

默认值 xtol=2e-12 可能会导致意外行为,如果期望 brenth 始终计算出相对误差接近机器精度的根。应根据具体用例仔细选择 xtol。将 xtol 设置为 5e-324(最小的次正规数)将确保最高级别的精度。当根位于或接近零时,在浮点数接近零的微小绝对差没有意义的应用中,较大的 xtol 值可能有助于节省函数评估。

参考

[BusAndDekker1975]

Bus, J. C. P., Dekker, T. J., “Two Efficient Algorithms with Guaranteed Convergence for Finding a Zero of a Function”, ACM Transactions on Mathematical Software, Vol. 1, Issue 4, Dec. 1975, pp. 330-345. 第 3 节:“算法 M”。 DOI:10.1145/355656.355659

示例

>>> def f(x):
...     return (x**2 - 1)
>>> from scipy import optimize
>>> root = optimize.brenth(f, -2, 0)
>>> root
-1.0
>>> root = optimize.brenth(f, 0, 2)
>>> root
1.0