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标量,
搜索区间的上界
- 参数tuple, 可选
包含函数 f 的额外参数。f 通过
f(x, *args)
调用。- 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。
- 完整输出bool, 可选
如果 full_output 为 False,则返回根。如果 full_output 为 True,返回值为
(x, r)
,其中 x 是根,r 是一个RootResults
对象。- dispbool, 可选
如果为 True,则在算法未收敛时引发 RuntimeError。否则,收敛状态记录在
RootResults
返回对象中。
- 返回:
- 根浮动
f 的近似根
- r :
RootResults
(如果full_output = True
则存在)RootResults(如果 full_output = True 则存在) 包含收敛信息的对象。特别是,如果例程收敛,
r.converged
为 True。
注释
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=1
或k=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