scipy.optimize.brentq

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

用布伦特方法在括号区间内求函数的根。

使用经典的布伦特方法找出函数的零点 f 关于符号变换区间的讨论 [a、b] 。通常被认为是这里最好的寻根程序。它是使用反二次外推的割线方法的安全版本。布伦特方法结合了根括号、区间二分法和反二次插值。它有时被称为van Wijngaarden-Dekker-Brent方法。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 就是它的确切根部。该参数必须为非负。对于好函数,Brent方法通常满足上述条件 xtol/2rtol/2[Brent1973]

rtol数字,可选

计算出的根 x0 将会令人满意 np.allclose(x, x0, atol=xtol, rtol=rtol) ,在哪里 x 就是它的确切根部。参数不能小于其默认值 4*np.finfo(float).eps 。对于好函数,Brent方法通常满足上述条件 xtol/2rtol/2[Brent1973]

maxiter整型,可选

如果在以下方面未实现融合 maxiter 迭代,则会引发错误。必须>=0。

args元组,可选

包含函数的额外参数 ff 由以下人员调用 apply(f, (x)+args)

full_output布尔值,可选

如果 full_output 为false,则返回根。如果 full_output 为True,则返回值为 (x, r) ,在哪里 x 是根,并且 r 是一种 RootResults 对象。

disp布尔值,可选

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

退货
x0浮动

零分,共零分 f 之间 ab

rRootResults (在以下情况下出席 full_output = True )RootResults(如果FULL_OUTPUT=True则存在)

对象,该对象包含有关收敛的信息。具体地说, r.converged 如果例程收敛,则为True。

注意事项

f 必须是连续的。f(A)和f(B)必须有相反的符号。

相关函数分为几类:

多变量局部优化器

fmin, fmin_powell, fmin_cg, fmin_bfgs, fmin_ncg

非线性最小二乘法

leastsq

约束多变量优化器

fmin_l_bfgs_b, fmin_tnc, fmin_cobyla

全局优化器

basinhopping, brute, differential_evolution

局部标量极小

fminbound, brent, golden, bracket

N-D寻根

fsolve

一维寻根

brenth, ridder, bisect, newton

标量定点仪

fixed_point

参考文献

Brent1973(1,2,3)

布伦特,共和党人, 不含导数的极小化算法 。恩格尔伍德·克里夫斯,新泽西州:普伦蒂斯-霍尔出版社,1973。CH.3比4。

PressEtal1992

书名/作者:W.H.Press;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