我正在使用下面的scipy代码。
import numpy as np
from scipy.optimize import basinhopping
n_iter = 100
@np.vectorize
def f(x):
return ( x * np.sin(x) + 2*x)**2
x0 = -6
minimizer_kwargs = {"method": "BFGS"}
ret = basinhopping(f, x0, minimizer_kwargs=minimizer_kwargs, niter=n_iter)
print("global minimum: x = %.4f, f(x0) = %.4f" % (ret.x, ret.fun))
这个函数的全局最小值是在0,但这不是盆地跳跃返回的结果,它根据起始位置x 0返回不同的局部最小值--而不是全局最小值在0。如果我们设置x_0 = -6,它返回的最小值在-7.7,如果我们设置x_0 = 1,它返回的最小值在0,依此类推。
为什么它不返回全局最小值?为什么它返回最接近其起始位置的局部最小值?
1条答案
按热度按时间2admgd591#
如果您将
n_iter
增加到1000
,它将工作!输出为
这是一个随机算法,在这种情况下,它需要一些更多的尝试,实际上使用
印刷品
具有
n_iter=850
的算法并不总是找到全局最小值。