scipy.optimize.

minimize_scalar#

scipy.optimize.minimize_scalar(fun, bracket=None, bounds=None, args=(), method=None, tol=None, options=None)[源代码][源代码]#

局部最小化单变量标量函数。

参数:
有趣可调用

目标函数。标量函数,必须返回一个标量。

括号序列,可选

对于方法 ‘brent’ 和 ‘golden’,bracket 定义了括号区间并且是必需的。可以是一个满足 xa < xb < xcfunc(xb) < func(xa) func(xb) < func(xc) 的三元组 (xa, xb, xc),或者是一个用于下坡括号搜索的初始点对 (xa, xb)``(参见 `scipy.optimize.bracket`)。最小化器 ``res.x 不一定满足 xa <= res.x <= xb

边界序列,可选

对于方法 ‘bounded’,bounds 是必需的,并且必须有两个对应于优化边界的有限项。

参数tuple, 可选

传递给目标函数的额外参数。

方法str 或 callable,可选

求解器类型。应为以下之一:

如果提供了边界,则默认值为“Bounded”,否则为“Brent”。有关每个求解器的详细信息,请参阅“注释”部分。

tolfloat, 可选

终止容差。如需详细控制,请使用特定求解器选项。

选项dict, 可选

求解器选项的字典。

maxiter整数

要执行的最大迭代次数。

disp布尔

设置为 True 以打印收敛消息。

查看 show_options 以获取特定求解器的选项。

返回:
res优化结果

优化结果表示为一个 OptimizeResult 对象。重要属性包括:x 解数组,success 一个布尔标志,指示优化器是否成功退出,以及 message 描述终止原因。有关其他属性的描述,请参见 OptimizeResult

参见

minimize

用于标量多元函数的最小化算法接口

show_options

求解器接受的附加选项

注释

本节描述了可以通过 ‘method’ 参数选择的可用求解器。如果传递了 bounds,默认方法是 "Bounded" Brent 方法,否则是无界的 "Brent" 方法。

方法 Brent 使用 Brent 的算法 [1] 来找到局部最小值。该算法在可能的情况下使用逆抛物线插值来加速黄金分割法的收敛。

方法 Golden 使用了黄金分割搜索技术 [1]。它使用类似于二分法的方法来缩小区间。通常更倾向于使用 Brent 方法。

方法 Bounded 可以执行有界最小化 [2] [3]。它使用 Brent 方法在区间 x1 < xopt < x2 中找到局部最小值。

请注意,Brent 和 Golden 方法除非提供有效的 bracket 三元组,否则不保证成功。如果找不到三点括号,请考虑使用 scipy.optimize.minimize。此外,所有方法仅用于局部最小化。当感兴趣的函数有多个局部最小值时,请考虑 全局优化

自定义最小化器

传递自定义的最小化方法可能是有用的,例如在使用某些库的前端来最小化标量时。你可以简单地将一个可调用对象作为 method 参数传递。

可调用对象被调用为 method(fun, args, **kwargs, **options),其中 kwargs 对应于传递给 minimize 的任何其他参数(如 brackettol 等),除了 options 字典,其内容也按对传递为 method 参数。该方法应返回一个 OptimizeResult 对象。

提供的 method 可调用对象必须能够接受(并可能忽略)任意参数;minimize 接受的参数集可能会在未来的版本中扩展,届时这些参数将被传递给该方法。你可以在 scipy.optimize 教程中找到一个示例。

Added in version 0.11.0.

参考文献

[1] (1,2)

Press, W., S.A. Teukolsky, W.T. Vetterling, 和 B.P. Flannery. C语言中的数值方法. 剑桥大学出版社.

[2]

Forsythe, G.E., M. A. Malcolm, 和 C. B. Moler. “计算机方法在数学计算中的应用.” Prentice-Hall 自动计算系列 259 (1977).

[3]

Brent, Richard P. 《无导数最小化算法》. Courier Corporation, 2013.

示例

考虑最小化以下函数的问题。

>>> def f(x):
...     return (x - 2) * x * (x + 2)**2

使用 Brent 方法,我们找到局部最小值为:

>>> from scipy.optimize import minimize_scalar
>>> res = minimize_scalar(f)
>>> res.fun
-9.9149495908

最小化器是:

>>> res.x
1.28077640403

使用 Bounded 方法,我们在指定的界限内找到一个局部最小值,如下所示:

>>> res = minimize_scalar(f, bounds=(-3, -1), method='bounded')
>>> res.fun  # minimum
3.28365179850e-13
>>> res.x  # minimizer
-2.0000002026