scipy.optimize.

括号#

scipy.optimize.bracket(func, xa=0.0, xb=1.0, args=(), grow_limit=110.0, maxiter=1000)[源代码][源代码]#

括号函数的最小值。

给定一个函数和不同的初始点,在初始点定义的下坡方向进行搜索,并返回三个包围函数最小值的点。

参数:
函数可调用函数 f(x,*args)

要最小化的目标函数。

xa, xbfloat, 可选

初始点。默认将 xa 设为 0.0,将 xb 设为 1.0。局部最小值不一定包含在此区间内。

参数tuple, 可选

附加参数(如果存在),传递给 func

grow_limitfloat, 可选

最大增长限制。默认值为 110.0。

maxiterint, 可选

最大迭代次数。默认为 1000。

返回:
xa, xb, xc浮动

括号的最后几点。

fa, fb, fc浮动

括号点处的目标函数值。

函数调用整数

函数评估的次数。

Raises:
BracketError

如果在算法终止前没有找到有效的括号。请参阅备注以了解有效括号的条件。

注释

该算法试图找到三个严格有序的点(即 \(x_a < x_b < x_c\)\(x_c < x_b < x_a\))满足 \(f(x_b) ≤ f(x_a)\)\(f(x_b) ≤ f(x_c)\),其中必须严格满足其中一个不等式,并且所有 \(x_i\) 必须是有限的。

示例

此函数可以找到函数的向下凸区域:

>>> import numpy as np
>>> import matplotlib.pyplot as plt
>>> from scipy.optimize import bracket
>>> def f(x):
...     return 10*x**2 + 3*x + 5
>>> x = np.linspace(-2, 2)
>>> y = f(x)
>>> init_xa, init_xb = 0.1, 1
>>> xa, xb, xc, fa, fb, fc, funcalls = bracket(f, xa=init_xa, xb=init_xb)
>>> plt.axvline(x=init_xa, color="k", linestyle="--")
>>> plt.axvline(x=init_xb, color="k", linestyle="--")
>>> plt.plot(x, y, "-k")
>>> plt.plot(xa, fa, "bx")
>>> plt.plot(xb, fb, "rx")
>>> plt.plot(xc, fc, "bx")
>>> plt.show()
../../_images/scipy-optimize-bracket-1_00_00.png

注意,最初的两个点都在最小值的右侧,第三个点是在“下坡”方向找到的:函数似乎在减少的方向(左侧)。最终的点是严格有序的,中间点的函数值小于端点的函数值;由此可以推断,最小值必定位于括号内。