brentq#
- scipy.optimize.brentq(f, a, b, args=(), xtol=2e-12, rtol=np.float64(8.881784197001252e-16), maxiter=100, full_output=False, disp=True)[源代码][源代码]#
使用 Brent 方法在区间内查找函数的根。
使用经典的 Brent 方法在符号变化的区间 [a, b] 上找到函数 f 的根。通常被认为是这里最好的根查找例程。它是使用反二次外推的割线方法的安全版本。Brent 方法结合了根括号、区间二分法和反二次插值。它有时被称为 van Wijngaarden-Dekker-Brent 方法。Brent (1973) 声称,对于在 [a, b] 内可计算的函数,收敛是保证的。
[Brent1973] 提供了该算法的经典描述。另一个描述可以在最近版本的《Numerical Recipes》中找到,包括 [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是精确的根。该参数必须为正。对于良好的函数,Brent 方法通常会以xtol/2和rtol/2满足上述条件。 [Brent1973]- rtol数字,可选
计算得到的根
x0将满足np.allclose(x, x0, atol=xtol, rtol=rtol),其中x是精确的根。该参数不能小于其默认值4*np.finfo(float).eps。对于良好的函数,Brent 方法通常会以xtol/2和rtol/2满足上述条件。 [Brent1973]- maxiterint, 可选
如果在 maxiter 次迭代中未达到收敛,则会引发错误。必须 >= 0。
- 参数tuple, 可选
包含函数的额外参数 f。f 通过
apply(f, (x)+args)调用。- 完整输出bool, 可选
如果 full_output 为 False,则返回根。如果 full_output 为 True,返回值为
(x, r),其中 x 是根,r 是一个RootResults对象。- dispbool, 可选
如果为 True,则在算法未收敛时引发 RuntimeError。否则,收敛状态将记录在任何
RootResults返回对象中。
- 返回:
- 根浮动
a 和 b 之间 f 的根。
- r :
RootResults(如果full_output = True则存在)RootResults(如果 full_output = True 则存在) 包含收敛信息的对象。特别是,如果例程收敛,
r.converged为 True。
注释
f 必须是连续的。f(a) 和 f(b) 必须具有相反的符号。
相关函数分为几类:
- 多元局部优化器
- 非线性最小二乘最小化器
- 约束多变量优化器
- 全局优化器
- 局部标量最小化器
- N-D 根查找
- 一维根查找
- 标量定点查找器
参考文献
[PressEtal1992]Press, W. H.; Flannery, B. P.; Teukolsky, S. A.; and Vetterling, W. T. Numerical Recipes in FORTRAN: The Art of Scientific Computing, 2nd ed. Cambridge, England: Cambridge University Press, pp. 352-355, 1992. Section 9.3: “Van Wijngaarden-Dekker-Brent Method.”
示例
>>> 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