使用Python求解带约束的最优化问题详解
题目:
1.利用拉格朗日乘子法
#导入sympy包,用于求导,方程组求解等等
fromsympyimport*
#设置变量
x1=symbols("x1")
x2=symbols("x2")
alpha=symbols("alpha")
beta=symbols("beta")
#构造拉格朗日等式
L=10-x1*x1-x2*x2+alpha*(x1*x1-x2)+beta*(x1+x2)
#求导,构造KKT条件
difyL_x1=diff(L,x1)#对变量x1求导
difyL_x2=diff(L,x2)#对变量x2求导
difyL_beta=diff(L,beta)#对乘子beta求导
dualCpt=alpha*(x1*x1-x2)#对偶互补条件
#求解KKT等式
aa=solve([difyL_x1,difyL_x2,difyL_beta,dualCpt],[x1,x2,alpha,beta])
#打印结果,还需验证alpha>=0和不等式约束<=0
foriinaa:
ifi[2]>=0:
if(i[0]**2-i[1])<=0:
print(i)
结果:
(-1,1,4,6) (0,0,0,0)
2.scipy包里面的minimize函数求解
fromscipy.optimizeimportminimize
importnumpyasnp
frommpl_toolkits.mplot3dimportAxes3D
frommatplotlibimportpyplotasplt
#目标函数:
deffunc(args):
fun=lambdax:10-x[0]**2-x[1]**2
returnfun
#约束条件,包括等式约束和不等式约束
defcon(args):
cons=({'type':'ineq','fun':lambdax:x[1]-x[0]**2},
{'type':'eq','fun':lambdax:x[0]+x[1]})
returncons
#画三维模式图
defdraw3D():
fig=plt.figure()
ax=Axes3D(fig)
x_arange=np.arange(-5.0,5.0)
y_arange=np.arange(-5.0,5.0)
X,Y=np.meshgrid(x_arange,y_arange)
Z1=10-X**2-Y**2
Z2=Y-X**2
Z3=X+Y
plt.xlabel('x')
plt.ylabel('y')
ax.plot_surface(X,Y,Z1,rstride=1,cstride=1,cmap='rainbow')
ax.plot_surface(X,Y,Z2,rstride=1,cstride=1,cmap='rainbow')
ax.plot_surface(X,Y,Z3,rstride=1,cstride=1,cmap='rainbow')
plt.show()
#画等高线图
defdrawContour():
x_arange=np.linspace(-3.0,4.0,256)
y_arange=np.linspace(-3.0,4.0,256)
X,Y=np.meshgrid(x_arange,y_arange)
Z1=10-X**2-Y**2
Z2=Y-X**2
Z3=X+Y
plt.xlabel('x')
plt.ylabel('y')
plt.contourf(X,Y,Z1,8,alpha=0.75,cmap='rainbow')
plt.contourf(X,Y,Z2,8,alpha=0.75,cmap='rainbow')
plt.contourf(X,Y,Z3,8,alpha=0.75,cmap='rainbow')
C1=plt.contour(X,Y,Z1,8,colors='black')
C2=plt.contour(X,Y,Z2,8,colors='blue')
C3=plt.contour(X,Y,Z3,8,colors='red')
plt.clabel(C1,inline=1,fontsize=10)
plt.clabel(C2,inline=1,fontsize=10)
plt.clabel(C3,inline=1,fontsize=10)
plt.show()
if__name__=="__main__":
args=()
args1=()
cons=con(args1)
x0=np.array((1.0,2.0))#设置初始值,初始值的设置很重要,很容易收敛到另外的极值点中,建议多试几个值
#求解#
res=minimize(func(args),x0,method='SLSQP',constraints=cons)
#####
print(res.fun)
print(res.success)
print(res.x)
#draw3D()
drawContour()
结果:
7.99999990708696 True [-1.000000021.00000002]
以上这篇使用Python求解带约束的最优化问题详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。