使用 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
参数中指定的优化算法。
考虑函数:
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
参数中指定的优化算法。