【发布时间】:2017-12-06 20:12:30
【问题描述】:
我想使用 scipy 添加 x[0] - x[1] > 0 的约束来优化以下公式。在目标函数中打印此表达式时,它也会给出负值,而优化成功终止。最终目标是最小化由于数学错误而失败的 sqrt(0.1*x[0]*x[1]) 。
import numpy as np
from scipy.optimize import minimize
def f(x):
print x[0] - x[1]
#return sqrt(0.1*x[0]*x[1])
return 0.1*x[0]*x[1]
def ineq_constraint(x):
return x[0] - x[1]
con = {'type': 'ineq', 'fun': ineq_constraint}
x0 = [1, 1]
res = minimize(f, x0, method='SLSQP', constraints=con)
print res
还有输出:
0.0
0.0
1.49011611938e-08
-1.49011611938e-08
0.0
0.0
1.49011611938e-08
-1.49011611938e-08
0.0
0.0
1.49011611938e-08
-1.49011611938e-08
4.65661176285e-10
4.65661176285e-10
1.53668223701e-08
-1.44355000176e-08
fun: 1.7509862319755833e-18
jac: array([ 3.95812066e-10, 4.42378184e-10, 0.00000000e+00])
message: 'Optimization terminated successfully.'
nfev: 16
nit: 4
njev: 4
status: 0
success: True
x: array([ 4.42378184e-09, 3.95812066e-09])
【问题讨论】:
-
在您的解决方案
x[0] - x[1] >= 0中,有什么问题? -
就您的最终目标而言,最小值 0.1*x[1]*x[1] 也是此函数平方根的最小值。你走运了!
-
感谢大家的cmets! @BillBell,这是我正在研究的多变量问题的虚拟简化 - 在这种情况下,不幸的是,运气不是一种选择。
-
@sascha,我的问题是我想做一些操作(例如 #return sqrt(0.1*x[0]*x[1]) 中的 sqrt,这可能会在某些情况下导致数学错误条件。我想在优化过程中使用约束来忽略这些情况,但显然,条件只适用于最终解决方案?我该如何解决?
-
我是在讽刺。只需省略平方根,只要它包含正在优化的整个函数即可。结果将是相同的。而且您不需要任何约束,以尝试将函数保持在平方根的域内。
标签: python optimization scipy constraints