scipy.optimize.

minimize_scalar#

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

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

参数:
fun可调用对象

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

假设可调用对象的签名为 f0(x, *my_args, **my_kwargs),其中 my_argsmy_kwargs 是必需的位置参数和关键字参数。与其将 f0 作为可调用对象传递,不如将其包装为仅接受 x;例如,传递 fun=lambda x: f0(x, *my_args, **my_kwargs) 作为可调用对象,其中 my_args (元组) 和 my_kwargs (字典) 在调用此函数之前已被收集。

bracket序列,可选

对于 ‘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

bounds序列,可选

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

args元组,可选

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

methodstr 或可调用对象,可选

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

  • Brent

  • Bounded

  • Golden

  • custom - 可调用对象(在 0.14.0 版本中添加),请参见下文

如果提供了 bounds,则默认为 “Bounded”,否则为 “Brent”。请参阅 ‘Notes’ 部分,了解每个求解器的详细信息。

tol浮点数,可选

终止的容差。要进行详细控制,请使用特定于求解器的选项。

options字典,可选

求解器选项的字典。

maxiterint

要执行的最大迭代次数。

dispbool

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

有关特定于求解器的选项,请参见 show_options

返回:
resOptimizeResult

优化结果表示为 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 中查找局部最小值。

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

自定义最小化器

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

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

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

在 0.11.0 版本中添加。

参考文献

[1] (1,2)

Press, W., S.A. Teukolsky, W.T. Vetterling, and B.P. Flannery. Numerical Recipes in C. Cambridge University Press.

[2]

Forsythe, G.E., M. A. Malcolm, and C. B. Moler. “Computer Methods for Mathematical Computations.” Prentice-Hall Series in Automatic Computation 259 (1977).

[3]

Brent, Richard P. Algorithms for Minimization Without Derivatives. 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