Python求解不等式优化问题
本文转载自https://zhuanlan.zhihu.com/p/394584501
文本旨在为常见的优化问题提供Python解决方案:
内容涉及六个部分:
求解带有约束的最小化问题 (本文只介绍此部分)
求解不带约束的最小化问题
求解线性优化问题
求解线性规划问题
求解全局最优化问题
求解二次规划问题
求解带有约束的最小化问题
使用工具:scipy.optimize.minimize
m
i
n
f
(
x
)
s
.
t
.
g
i
(
x
)
>
0
,
i
=
1
,
…
,
m
h
j
(
x
)
=
0
,
j
=
1
,
…
,
n
x
k
>
0
,
k
=
1
,
…
,
l
min \quad f(x) \\ s.t. \\ g_i(x)>0, i=1,\dots,m \\ h_j(x)=0, j=1,\dots,n \\ x_k \gt0,k=1,\dots,l
minf(x)s.t.gi(x)>0,i=1,…,mhj(x)=0,j=1,…,nxk>0,k=1,…,l
请注意,最优化问题中的不等式约束一般写为
≤
\le
≤不等式,但在scipy.optimize.minimize
中采用
≥
\ge
≥不等式
from scipy.optimize import minimize
e = 1e-10
fun = lambda x:(x[0] - 0.667) / (x[0] + x[1] + x[2] - 2) # 目标函数
# 亦可写成如下形式
def fun(x):
return (x[0] - 0.667) / (x[0] + x[1] + x[2] - 2)
cons = ({'type':'eq','fun':lambda x:x[0] * x[1] * x[2] - 1}, #约束条件:xyz=1
{'type':'ineq','fun':lambda x:x[0] - e}, #x,y,z都分别大于0
{'type':'ineq','fun':lambda x:x[1] - e},
{'type':'ineq','fun':lambda x:x[2] - e})
x0 = np.array((1.0,1.0,1.0)) #设置xyz的初始值
res = minimize(fun,x0,method='SLSQP',constraints=cons)
print("最小值:",res.fun)
print("最优解:",res.x)
print("迭代终止是否成功",res.success)
print("迭代终止原因",res.message)