scipy.optimize.

ridder#

scipy.optimize.ridder(f, a, b, args=(), xtol=2e-12, rtol=np.float64(8.881784197001252e-16), maxiter=100, full_output=False, disp=True)[source]#

使用 Ridder 方法在给定区间内找到函数的根。

参数:
f函数

一个返回数值的 Python 函数。f 必须是连续的,且 f(a) 和 f(b) 必须异号。

a标量

包围区间 [a,b] 的一端。

b标量

包围区间 [a,b] 的另一端。

xtol数值, 可选

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

rtol数值, 可选

计算得到的根 x0 将满足 np.isclose(x, x0, atol=xtol, rtol=rtol),其中 x 是精确的根。该参数不能小于其默认值 4*np.finfo(float).eps

maxiter整数, 可选

如果未能在 maxiter 次迭代内达到收敛,则会引发错误。必须 >= 0。

args元组, 可选

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

full_output布尔值, 可选

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

disp布尔值, 可选

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

返回:
root浮点数

函数 fab 之间的根。

rRootResults (如果 full_output = True 则存在)

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

另请参阅

brentq, brenth, bisect, newton

一维求根

fixed_point

标量不动点查找器

elementwise.find_root

高效的逐元素一维求根器

说明

使用 [Ridders1979] 方法在参数 ab 之间找到函数 f 的根。Ridder 方法比二分法快,但通常不如 Brent 例程快。[Ridders1979] 提供了该算法的经典描述和来源。在任何最新版本的《数值食谱》(Numerical Recipes) 中也可以找到相关描述。

此处使用的例程与标准介绍略有不同,以便对容差更加谨慎。

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

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

参考文献

[Ridders1979] (1,2)

Ridders, C. F. J. “一种计算实连续函数单个根的新算法。” IEEE Trans. Circuits Systems 26, 979-980, 1979。

示例

>>> def f(x):
...     return (x**2 - 1)
>>> from scipy import optimize
>>> root = optimize.ridder(f, 0, 2)
>>> root
1.0
>>> root = optimize.ridder(f, -2, 0)
>>> root
-1.0