首页 > 解决方案 > 使用 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] 中的所有实数(单位间隔?)。如果它是第一个,我不确定如何进入第二个我该怎么做?

标签: python-3.xmathematical-optimization

解决方案


您的原始代码不起作用,因为

""行继续字符后的意外字符" At \ bounds = bnds":

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

一旦你修复它,你会得到一个错误说

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

这是因为minimize想要一个接受一个输入的函数(阅读“参数:文档的有趣部分” )。该输入可以是一个形状数组(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参数中指定的优化算法。


推荐阅读