scipy.optimize.

toms748#

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

使用 TOMS 算法 748 方法查找根。

实现 Alefeld、Potro 和 Shi 的算法 748 方法,以查找函数在区间 [a, b] 上的根,其中 f(a) 和 f(b) 必须具有相反的符号。

它使用逆三次插值和“牛顿二次”步骤的混合方法。[APS1995]。

参数:
f函数

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

a标量,

搜索区间下边界

b标量,

搜索区间上边界

args元组,可选

包含函数的额外参数f。通过f(x, *args)调用f

kint,可选

每个迭代执行的牛顿二次步数。 k>=1

xtol标量,可选

计算的根 x0 将满足 np.allclose(x, x0, atol=xtol, rtol=rtol),其中 x 是精确根。此参数必须为正。

rtol标量,可选

计算的根 x0 将满足 np.allclose(x, x0, atol=xtol, rtol=rtol),其中 x 是精确根。

maxiterint,可选

如果未在 maxiter 次迭代中实现收敛,则会引发错误。它必须 ≥ 0。

full_outputbool,可选

如果 full_output 为 False,则返回根。如果 full_output 为 True,则返回值为 (x, r),其中 x 是根,r 是一个 RootResults对象。

dispbool,可选

如果为 True,则如果算法未收敛则引发 RuntimeError。否则,收敛状态会记录在 RootResults 返回对象中。

返回:
root浮点

f 的近似根

rRootResults(在 full_output = True

包含收敛信息的对象。特别是,如果例行程序收敛,r.converged 会变为 True。

另请参阅

brentqbrenthridderbisectnewton
fsolve

在 N 维中查找根。

注意

f 必须连续。算法 748(k=2)在渐近意义上是寻找四次连续可微分函数的根的最有效算法。与布伦特算法相比,布伦特算法可能只在最后一步缩小包围界限的长度,而算法 748 则在每次迭代中缩小包围界限的长度,且渐近效率与查找的根相同。

为了方便陈述效率指数,假设 f 有 4 个连续导数。对于 k=1,收敛阶数至少为 2.7,且每次迭代约有 2 个渐近函数值,效率指数大约为 1.65。对于 k=2,阶数约为 4.6,每次迭代约有 3 个渐近函数值,效率指数为 1.66。对于更高级别的 k,效率指数接近 (3k-2) 的 k 次方根,因此通常 k=1k=2 是适合的。

参考

[APS1995]

Alefeld, G. E. 和 Potra, F. A. 和 Shi, Yixun,算法 748:连续函数的围零,ACM 转化。数学。软件。卷 221(1995) doi = {10.1145/210089.210111}

示例

>>> def f(x):
...     return (x**3 - 1)  # only one real root at x = 1
>>> from scipy import optimize
>>> root, results = optimize.toms748(f, 0, 2, full_output=True)
>>> root
1.0
>>> results
      converged: True
           flag: converged
 function_calls: 11
     iterations: 5
           root: 1.0
         method: toms748