scipy.optimize.

brentq#

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

使用 Brent 方法在括号区间内查找函数的根。

使用经典的 Brent 方法在变号区间 [a, b] 上查找函数 f 的根。它通常被认为是这里最好的求根例程。它是割线法的一种安全版本,使用逆二次外推。Brent 方法结合了根区间确定、区间二分和逆二次插值。它有时被称为 van Wijngaarden-Dekker-Brent 方法。Brent (1973) 声称对于在 [a,b] 内可计算的函数,收敛性是有保证的。

[Brent1973] 提供了该算法的经典描述。在最新版的《数值食谱》中可以找到另一个描述,包括 [PressEtal1992]。第三个描述位于 https://mathworld.net.cn/BrentsMethod.html。通过阅读我们的代码,应该很容易理解该算法。我们的代码与标准介绍略有不同:我们为外推步骤选择了一个不同的公式。

参数:
f函数

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

a标量

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

b标量

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

xtol数值,可选

计算出的根 x0 将满足 np.isclose(x, x0, atol=xtol, rtol=rtol),其中 x 是精确的根。该参数必须为正。对于良好的函数,Brent 方法通常会使用 xtol/2rtol/2 来满足上述条件。 [Brent1973]

rtol数值,可选

计算出的根 x0 将满足 np.isclose(x, x0, atol=xtol, rtol=rtol),其中 x 是精确的根。该参数不能小于其默认值 4*np.finfo(float).eps。对于良好的函数,Brent 方法通常会使用 xtol/2rtol/2 来满足上述条件。 [Brent1973]

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维求根

brenth, ridder, bisect, newton

一维求根

fixed_point

标量不动点查找器

elementwise.find_root

高效的逐元素一维求根器

注意

f 必须是连续的。f(a) 和 f(b) 必须具有相反的符号。

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

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

参考文献

[Brent1973] (1,2,3)

Brent, R. P.,《无导数最小化算法》。英格尔伍德崖,新泽西州:Prentice-Hall,1973年。第3-4章。

[PressEtal1992]

Press, W. H.; Flannery, B. P.; Teukolsky, S. A.; 和 Vetterling, W. T.《FORTRAN 数值算法:科学计算的艺术》,第2版。英国剑桥:剑桥大学出版社,第352-355页,1992年。第9.3节:“Van Wijngaarden-Dekker-Brent 方法。”

示例

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