使用 SciPy 的多变量函数局部最小值

Multivariable function local minimum using SciPy

考虑函数:

def f(x,y):
    return x + 3*exp(y**2)

我想知道是否可以使用 SciPy.optimize.minimize

找到 [0,1](单位间隔)(对于 x 和 y)的最小值?

这是我的尝试:

bound = (0,1)
bds = [bound,bound]
x_0 = [0,0] (initial guess)

因此,

scipy.optimize.minimize(f,x_0,method='SLSQP', \ bounds = bds)

但这不起作用。

我不断得到:

“续行字符后出现意外字符”At \bounds = bnds

请注意,我希望我的 x 和 y 随 [0,1]

上的实数而变化

编辑:

def f(x):
    return x[0] + 3*exp(x[1]**2)

bound = (0,1)
bds = [bound,bound]
x_0 = [0,0] (initial guess)


scipy.optimize.minimize(f,x_0,method='SLSQP', bounds = bds)

这个最小化函数是否只查看整数值 0 和 1?还是查看 [0,1] 中的所有实数(单位间隔?)。如果是第一个,我不确定如何进入第二个,我该怎么做?

表示为 OptimizeResult 对象的优化结果。重要的属性是:x 解决方案数组,success 一个布尔标志,指示优化器是否成功退出,以及描述终止原因的消息。

您的原始代码无法运行,因为

""unexpected character after line continuation character" At \ bounds = bnds":

告诉您“续行字符”(反斜杠)导致了问题。在那个角色之后你不能有任何东西。在反斜杠后插入换行符,或完全删除反斜杠

修复后,您会收到一条错误消息

TypeError: f() missing 1 required positional argument: 'y'

这是因为 minimize 想要一个接受 one 输入的函数(阅读“参数:documentation 的有趣部分”)。该输入可以是一个形状为 (n, ) 的数组。当你想要一个多变量最小化时,所有 n 个变量都进入你函数的那个​​单一参数


回复:“这个最小化函数是只查看整数值 0 和 1 吗?还是查看 [0,1](单位区间?)中的所有实数?如果它是首先,我不确定如何进入第二个。"

如果它只检查边界值,那将是一个非常无用的优化器,你不觉得吗?

虽然这很容易检查!您当前的函数的最小值为 [0, 0],因此这不是测试函数功能的好方法。让我们定义一个具有不同数字的最小值的函数。例如,让我们定义一个最小值为 [0.5, 0.5]

的函数
def f(X):
    return abs(X[0] - 0.5) * abs(X[1] - 0.5)

运行 您的代码给出了结果:

     fun: 0.0
     jac: array([0., 0.])
 message: 'Optimization terminated successfully.'
    nfev: 8
     nit: 2
    njev: 2
  status: 0
 success: True
       x: array([0.5, 0.5])

这很清楚 minimize() 在整个间隔中查找。

它并没有真正查看区间中的 所有 个实数(这是不可能的,因为任何区间中都有无限实数)。相反,它使用您在 method 参数中指定的优化算法。