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_args
和my_kwargs
是必需的位置参数和关键字参数。与其将f0
作为可调用对象传递,不如将其包装以仅接受x
;例如,将fun=lambda x: f0(x, *my_args, **my_kwargs)
作为可调用对象传递,其中my_args
(元组) 和my_kwargs
(字典) 已在此函数调用前收集。- bracket序列,可选
对于 'brent' 和 'golden' 方法,
bracket
定义了区间,并且是必需的。可以是满足xa < xb < xc
且func(xb) < func(xa) and func(xb) < func(xc)
的三元组(xa, xb, xc)
,或者是一个用于下坡区间搜索初始点的二元组(xa, xb)
(参见scipy.optimize.bracket
)。最小化器res.x
不一定满足xa <= res.x <= xb
。- bounds序列,可选
对于 'bounded' 方法,bounds 是强制性的,并且必须有两个有限项对应于优化边界。
- args元组,可选
传递给目标函数的额外参数。
- method字符串或可调用对象,可选
求解器类型。应为以下之一:
如果提供了边界,默认为“Bounded”方法;否则为“Brent”方法。有关每个求解器的详细信息,请参阅“备注”部分。
- tol浮点数,可选
终止容差。如需详细控制,请使用特定于求解器的选项。
- options字典,可选
求解器选项的字典。
- 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 中找到局部最小值。
请注意,除非提供了有效的
bracket
三元组,否则 Brent 和 Golden 方法不能保证成功。如果无法找到三点区间,请考虑使用scipy.optimize.minimize
。此外,所有方法仅用于局部最小化。当目标函数有多个局部最小值时,请考虑使用 全局优化。自定义最小化器
传入自定义最小化方法可能很有用,例如在使用某个库前端进行 minimize_scalar 操作时。您只需将可调用对象作为
method
参数传递。该可调用对象被调用为
method(fun, args, **kwargs, **options)
,其中kwargs
对应于传递给minimize
的任何其他参数(例如bracket
、tol 等),除了 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. 剑桥大学出版社。
[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