brentq#
- scipy.optimize.brentq(f, a, b, args=(), xtol=2e-12, rtol=8.881784197001252e-16, maxiter=100, full_output=False, disp=True)[源代码]#
使用布伦特方法在括号区间内找到函数的根。
使用经典的布伦特方法在符号变化的区间 [a, b] 上找到函数 f 的根。通常认为这里是最好的求根例程。它是割线法的安全版本,使用反二次外推。布伦特方法结合了根的括号、区间二分和反二次插值。它有时被称为 van Wijngaarden-Dekker-Brent 方法。布伦特 (1973) 声称对于在 [a,b] 内可计算的函数,收敛是保证的。
[Brent1973] 提供了该算法的经典描述。另一个描述可以在最近一版的《数值食谱》中找到,包括 [PressEtal1992]。第三个描述位于 http://mathworld.wolfram.com/BrentsMethod.html。只需阅读我们的代码,就应该很容易理解该算法。我们的代码与标准表示法略有不同:我们为外推步骤选择了不同的公式。
- 参数:
- f函数
返回数字的 Python 函数。函数 \(f\) 必须是连续的,并且 \(f(a)\) 和 \(f(b)\) 必须具有相反的符号。
- a标量
括号区间 \([a, b]\) 的一端。
- b标量
括号区间 \([a, b]\) 的另一端。
- xtol数字,可选
计算出的根
x0
将满足np.allclose(x, x0, atol=xtol, rtol=rtol)
,其中x
是精确的根。该参数必须为正数。对于好的函数,布伦特方法通常会满足上述条件,其中xtol/2
和rtol/2
。[Brent1973]- rtol数字,可选
计算出的根
x0
将满足np.allclose(x, x0, atol=xtol, rtol=rtol)
,其中x
是精确的根。该参数不能小于其默认值4*np.finfo(float).eps
。对于好的函数,布伦特方法通常会满足上述条件,其中xtol/2
和rtol/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浮点数
f 在 a 和 b 之间的根。
- r
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 维求根
brenth
,ridder
,bisect
,newton
1 维求根
fixed_point
标量不动点查找器
备注
f 必须是连续的。f(a) 和 f(b) 必须具有相反的符号。
参考文献
[PressEtal1992]Press, W. H.; Flannery, B. P.; Teukolsky, S. A.; and 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