【问题标题】:Minimize a function in a given interval with scipy.optimize.brute使用 scipy.optimize.brute 在给定间隔内最小化函数
【发布时间】:2014-02-14 02:32:33
【问题描述】:

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

这是我在脚本中写的:

ranges = slice(-pi/2, pi/2, pi/200)
res = optimize.brute(g, (ranges,))

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)

结果res

array([-3.14159265])

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

【问题讨论】:

  • 你有g当解超过区间的实际例子吗?以及结果的价值?
  • 回答我自己的评论,看起来def g(x): return sin(0.5*x) 已经符合要求了。
  • 这是我的函数:-(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
  • 嗯...,介意我坚持我的sin(0.5*x) 示例吗? ;-)。
  • 我已经用您提供的输入和输出更新了您的问题。这比将其放入 cmets 更清楚,但我认为您还没有足够的声誉来自己编辑问题。

标签: python scipy mathematical-optimization


【解决方案1】:

如果传递的参数超出您的期望范围,您可以编写目标函数以返回 np.inf。所以,例如:

def g(x, x_limit):

if x > x_limit:
    return np.inf
else:
    return (-(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)

【讨论】:

    【解决方案2】:

    “问题”与默认的“精加工功能”有关:brute 可以选择提供精加工最小化功能。这样做是为了可以使用蛮力法作为第一个猜测,然后可以使用更好的最小化函数对结果进行“抛光”。

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

    解决方法很简单:

    res = optimize.brute(g, (ranges,), finish=None)
    

    会给你想要的。

    scipy.optimize.brute documentation 的强制链接。

    【讨论】:

    • +1。这不是第一次有人对brute 的默认行为感到惊讶,其中finish=fmingithub.com/scipy/scipy/issues/1613
    • @WarrenWeckesser 谢谢。我正要寻找这个(我不使用brute,所以看到这个我很惊讶)。不幸的是,没有finish=None 作为默认值的明显原因是向后兼容。由于还没有 1.0 版本,它可能会被更改(但是,是的,很多科学家会感到惊讶,甚至不会注意到不正确的结果,因为我不希望大多数 scipy 用户仔细阅读版本之间的发行说明)。
    • 没有办法在 fmin 上设置界限并使其默认匹配?
    猜你喜欢
    • 2021-04-01
    • 2011-01-30
    • 2018-09-05
    • 2019-07-14
    • 1970-01-01
    • 2023-01-27
    • 1970-01-01
    • 2023-04-07
    • 1970-01-01
    相关资源
    最近更新 更多