Python scipy.optimize.brentq 示例说明
使用 Brent 方法在括号区间中找到函数的根。
使用经典的 Brent 方法在符号变化区间 [a , b] 上找到函数 f 的零点。一般认为这里是最好的寻根例程。它是使用反二次外推法的割线法的安全版本。 Brent 的方法结合了根括号法、区间二等分法和逆二次插值法。它有时被称为 van Wijngaarden-Dekker-Brent 方法。 Brent (1973) 声称在 [a,b] 内可计算的函数保证收敛。
[Brent1973] 提供了算法的经典说明。另一种说明可以在最近版本的数字食谱中找到,包括 [PressEtal1992] 。第三个说明位于 http://mathworld.wolfram.com/BrentsMethod.html 。阅读我们的代码应该很容易理解算法。我们的代码与标准演示有些不同:我们为外推步骤选择了不同的公式。
- f: 函数
-
Python 函数返回一个数字。函数 必须是连续的,并且 和 必须有相反的符号。
- 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: int 可选
-
如果在 maxiter 迭代中未实现收敛,则会引发错误。必须 >= 0。
- args: 元组,可选
-
包含函数的额外参数f.f被称为
apply(f, (x)+args)
. - full_output: 布尔型,可选
-
如果full_output为 False,则返回根。如果full_output为真,返回值为
(x, r)
,其中x是根,并且r是一个RootResults对象。 - disp: 布尔型,可选
-
如果为真,如果算法没有收敛,则提高 RuntimeError。否则,收敛状态记录在任何 RootResults 返回对象中。
- x0: 浮点数
-
a 和 b 之间的 f 为零。
-
r: RootResults (如果
full_output = True
则存在) -
包含有关收敛信息的对象。特别是,如果例程收敛,
r.converged
为 True。
参数:
返回:
注意:
f 必须是连续的。 f(a) 和 f(b) 必须有相反的符号。
相关函数分为几类:
-
fmin , fmin_powell , fmin_cg , fmin_bfgs , fmin_ncg
-
scipy.optimize.leastsq
-
fmin_l_bfgs_b , fmin_tnc , fmin_cobyla
-
basinhopping , brute , differential_evolution
-
fminbound , brent , golden , bracket
-
scipy.optimize.fsolve
-
brenth , ridder , bisect , newton
-
scipy.optimize.fixed_point
多元局部优化器:
非线性最小二乘最小化器:
受约束的多元优化器:
全局优化器:
局部标量最小化器:
N-D root-finding:
一维root-finding:
标量定点查找器:
参考:
-
Brent, R. P.,无导数最小化算法。新泽西州恩格尔伍德悬崖:Prentice-Hall,1973 年。 3-4。
-
新闻,W. H.;弗兰纳里,B. P.; Teukolsky, S. A.;和 Vetterling,W. T. FORTRAN 中的数值食谱:科学计算的艺术,第 2 版。英国剑桥:剑桥大学出版社,第 352-355 页,1992 年。第 9.3 节:“Van Wijngaarden-Dekker-Brent 方法”。
布伦特1973 (1、2、3):
scipy.optimize.brentq:
例子:
>>> 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