Scipy BasinHopping未返回正确的全局最小值

cxfofazt  于 2022-11-10  发布在  其他
关注(0)|答案(1)|浏览(130)

我正在使用下面的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,依此类推。
为什么它不返回全局最小值?为什么它返回最接近其起始位置的局部最小值?

2admgd59

2admgd591#

如果您将n_iter增加到1000,它将工作!
输出为

"global minimum: x = 0.0000, f(x0) = 0.0000"

这是一个随机算法,在这种情况下,它需要一些更多的尝试,实际上使用

import numpy as np
from scipy.optimize import basinhopping

while True:
    n_iter = 850 

    @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))

印刷品

"""
global minimum: x = -7.7230, f(x0) = 60.6709
global minimum: x = -0.0000, f(x0) = 0.0000
global minimum: x = -0.0000, f(x0) = 0.0000
global minimum: x = 0.0000, f(x0) = 0.0000
global minimum: x = -0.0000, f(x0) = 0.0000
global minimum: x = 0.0000, f(x0) = 0.0000
global minimum: x = -0.0000, f(x0) = 0.0000
global minimum: x = -0.0000, f(x0) = 0.0000
global minimum: x = -0.0000, f(x0) = 0.0000
global minimum: x = -7.7230, f(x0) = 60.6709
...
"""

具有n_iter=850的算法并不总是找到全局最小值。

相关问题