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)[源代码][源代码]#

使用Brent方法与双曲线外推法在区间内寻找函数的根。

在经典的 Brent 程序基础上,找到函数 f 在参数 a 和 b 之间的根,使用双曲线外推而不是反二次外推。Bus & Dekker (1975) 保证这种方法的收敛性,声称这里的函数评估上限是二分法的 4 或 5 倍。f(a) 和 f(b) 不能有相同的符号。通常情况下,与 brent 程序相当,但测试不如后者充分。这是一种使用双曲线外推的安全割线法。这里的版本由 Chuck Harris 提供,并实现了 [BusAndDekker1975] 中的算法 M,其中可以找到更多细节(收敛性、附加评论等)。

参数:
f函数

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

a标量

括号区间的 [a,b] 的一端。

b标量

括号区间的另一端 [a,b]。

xtol数字,可选

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

rtol数字,可选

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

maxiterint, 可选

如果在 maxiter 次迭代中未达到收敛,则会引发错误。必须 >= 0。

参数tuple, 可选

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

完整输出bool, 可选

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

dispbool, 可选

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

返回:
浮动

ab 之间 f 的根。

r : RootResults (如果 full_output = True 则存在)RootResults(如果 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-D 根查找

brentq, brenth, ridder, bisect, newton

一维根查找

fixed_point

标量定点查找器

参考文献

[BusAndDekker1975]

Bus, J. C. P., Dekker, T. J., “两种高效算法及其保证收敛性以寻找函数零点”, ACM Transactions on Mathematical Software, 第1卷, 第4期, 1975年12月, 第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