使用Python求解带约束的最优化问题详解


Posted in Python onFebruary 11, 2020

题目:

使用Python求解带约束的最优化问题详解

1. 利用拉格朗日乘子法

#导入sympy包,用于求导,方程组求解等等
from sympy import * 
 
#设置变量
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
for i in aa:
 if i[2] >= 0:
 if (i[0]**2 - i[1]) <= 0:
  print(i)

结果:

(-1, 1, 4, 6)
(0, 0, 0, 0)

2. scipy包里面的minimize函数求解

from scipy.optimize import minimize
import numpy as np 
 
from mpl_toolkits.mplot3d import Axes3D
from matplotlib import pyplot as plt 
 
#目标函数:
def func(args):
 fun = lambda x: 10 - x[0]**2 - x[1]**2
 return fun
 
#约束条件,包括等式约束和不等式约束
def con(args):
 cons = ({'type': 'ineq', 'fun': lambda x: x[1]-x[0]**2},
  {'type': 'eq', 'fun': lambda x: x[0]+x[1]})
 return cons 
 
#画三维模式图
def draw3D():
 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()
 
#画等高线图
def drawContour():
 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.00000002 1.00000002]

使用Python求解带约束的最优化问题详解

以上这篇使用Python求解带约束的最优化问题详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python实现的阳历转阴历(农历)算法
Apr 25 Python
python中Flask框架简单入门实例
Mar 21 Python
python定时利用QQ邮件发送天气预报的实例
Nov 17 Python
python调用API实现智能回复机器人
Apr 10 Python
tensorflow 使用flags定义命令行参数的方法
Apr 23 Python
python3实现随机数
Jun 25 Python
Python中文编码知识点
Feb 18 Python
在python中利用numpy求解多项式以及多项式拟合的方法
Jul 03 Python
python3.6编写的单元测试示例
Aug 17 Python
python递归下载文件夹下所有文件
Aug 31 Python
在Python中字典按值排序的实现方法
Nov 12 Python
Python 数据可视化之Bokeh详解
Nov 02 Python
python 非线性规划方式(scipy.optimize.minimize)
Feb 11 #Python
使用遗传算法求二元函数的最小值
Feb 11 #Python
Python for循环搭配else常见问题解决
Feb 11 #Python
Python获取二维数组的行列数的2种方法
Feb 11 #Python
使用Puppeteer爬取微信文章的实现
Feb 11 #Python
Python实现遗传算法(二进制编码)求函数最优值方式
Feb 11 #Python
python加密解密库cryptography使用openSSL生成的密匙加密解密
Feb 11 #Python
You might like
php+AJAX传送中文会导致乱码的问题的解决方法
2008/09/08 PHP
PHP利用REFERER根居访问来地址进行页面跳转
2013/09/28 PHP
PC端微信扫码支付成功之后自动跳转php版代码
2017/07/07 PHP
浅谈Laravel核心解读之Console内核
2018/12/02 PHP
轻轻松松学习JavaScript
2007/02/25 Javascript
js 操作符实例代码
2009/10/24 Javascript
javascript与CSS复习(三)
2010/06/29 Javascript
javascript操作JSON的要领总结
2012/12/09 Javascript
jquery实现带复选框的表格行选中删除时高亮显示
2013/08/01 Javascript
表单元素与非表单元素刷新区别详细解析
2013/11/06 Javascript
jquery中的过滤操作详细解析
2013/12/02 Javascript
jquery实现弹出层效果实例
2015/05/19 Javascript
JavaScript实现简单获取当前网页网址的方法
2015/11/09 Javascript
jQuery如何获取动态添加的元素
2016/06/24 Javascript
Jquery循环截取字符串的方法(多出的字符串处理成&quot;...&quot;)
2016/11/28 Javascript
开源免费天气预报接口API及全国所有地区代码(国家气象局提供)
2016/12/26 Javascript
JS 实现随机验证码功能
2017/02/15 Javascript
jQuery使用DataTable实现删除数据后重新加载功能
2017/02/27 Javascript
JavaScript实现简单评论功能
2017/08/17 Javascript
详解Webpack loader 之 file-loader
2018/11/07 Javascript
linux系统使用python监测网络接口获取网络的输入输出
2014/01/15 Python
Python中条件判断语句的简单使用方法
2015/08/21 Python
Python解析树及树的遍历
2016/02/03 Python
python实现淘宝秒杀聚划算抢购自动提醒源码
2020/06/23 Python
python基础知识(一)变量与简单数据类型详解
2019/04/17 Python
pyqt5 tablewidget 利用线程动态刷新数据的方法
2019/06/17 Python
OpenCV 边缘检测
2019/07/10 Python
Python3利用openpyxl读写Excel文件的方法实例
2021/02/03 Python
信息技术专业大学生个人的自我评价
2013/10/05 职场文书
大学军训通讯稿
2014/01/13 职场文书
《狼》教学反思
2014/03/02 职场文书
《第一次抱母亲》教学反思
2014/04/16 职场文书
大学生作弊检讨书
2014/09/11 职场文书
2014年校务公开工作总结
2014/12/18 职场文书
2015年幼儿园班务工作总结
2015/05/12 职场文书
MySQL系列之十四 MySQL的高可用实现
2021/07/02 MySQL