使用scipy.optimize.brute最小化给定时间间隔内的函数

Abd*_*lah 3 python mathematical-optimization scipy

我试图在给定的时间间隔内最小化函数; 在我的情况下,间隔是[-pi/2, pi/2].

这是我在我的脚本中写的:

ranges = slice(-pi/2, pi/2, pi/200)
res = optimize.brute(g, (ranges,))
Run Code Online (Sandbox Code Playgroud)

def g(x):
    # z and a are global
    (-(z+1) * (((a/4) * (3*cos(x/3) + cos(3*x/2)) +
                (b/4) * (-3*sin(x/2)-3*sin(3*x/2)))**2 +
               ((a/4??) * (sin(x/3) + sin(3*x/2)) + (b/4)*
                (cos(x/2) + 3*cos(3*x/2)))**2) + 4*(c*cos(x/2))**2)
Run Code Online (Sandbox Code Playgroud)

结果res

array([-3.14159265])
Run Code Online (Sandbox Code Playgroud)

我在绘制解决方案时遇到的问题是最小化的一些解决方案超出了间隔[-pi/2, pi/2].有帮助吗?

小智 10

"问题"是默认的"修整功能":brute可以选择提供修整最小化功能.这样做是为了使蛮力方法可以用作第一个猜测,然后可以使用更好的最小化函数"抛光"结果.

如果此功能设置为无,则不会发生任何事情,这可能是您想要的.不幸的是,在这种情况下,默认设置为fmin,这是下坡单面(Nelder-Mead)方法,这将简单地忽略任何范围/网格规范.因此,对于类似的函数sin(0.5 * x),它将从brute函数found(-pi/2)的最低点开始并从那里继续,发现-pi是(最接近)全局最小值.

解决方案很简单:

res = optimize.brute(g, (ranges,), finish=None)
Run Code Online (Sandbox Code Playgroud)

会给你想要的.

强制链接到scipy.optimize.brute文档.

  • +1。这不是第一次有人对 `brute` 的默认行为感到惊讶,其中 `finish=fmin`:https://github.com/scipy/scipy/issues/1613 (2认同)