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 的根,其中 f(a)f(b) 必须具有相反的符号。

它结合了逆三次插值和“牛顿二次”步进法。 [APS1995]。

参数:
f函数

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

a标量,

搜索区间的下限

b标量,

搜索区间的上限

args元组,可选

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

k整型,可选

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

xtol标量,可选

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

rtol标量,可选

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

maxiter整型,可选

如果经过 maxiter 次迭代仍未收敛,则会引发错误。必须 >= 0。

full_output布尔型,可选

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

disp布尔型,可选

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

返回:
root浮点数

f 的近似根

rRootResults (如果 full_output = True 则存在)

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

另请参阅

brentq, brenth, ridder, bisect, newton
fsolve

在 N 维空间中查找根。

elementwise.find_root

高效的逐元素一维求根器

备注

f 必须是连续的。当 k=2 时,算法 748 是已知用于查找四次连续可微函数根的渐近最高效算法。与 Brent 算法(可能仅在最后一步减小包围区间的长度)不同,算法 748 在每次迭代中都会减小包围区间的长度,且其渐近效率与找到根时的效率相同。

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

如参数文档中所述,计算得到的根 x0 将满足 np.isclose(x, x0, atol=xtol, rtol=rtol),其中 x 是精确的根。以方程形式表示,此终止条件为 abs(x - x0) <= xtol + rtol * abs(x0)

默认值 xtol=2e-12 可能会导致意外行为,如果期望 toms748 始终计算出相对误差接近机器精度的根。应根据具体用例谨慎选择 xtol。将 xtol 设置为 5e-324(最小的次正常数),将确保最高级别的精度。在根位于或接近零的应用程序中,如果浮点数在零附近的微小绝对差异没有意义,则较大的 xtol 值可能有助于节省函数求值次数。

参考文献

[APS1995]

Alefeld, G. E. and Potra, F. A. and Shi, Yixun, Algorithm 748: Enclosing Zeros of Continuous Functions, ACM Trans. Math. Softw. Volume 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