使用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 相关文章推荐
Linux下通过python访问MySQL、Oracle、SQL Server数据库的方法
Apr 23 Python
Python中的descriptor描述器简明使用指南
Jun 02 Python
python监控文件或目录变化
Jun 07 Python
利用python发送和接收邮件
Sep 27 Python
详解supervisor使用教程
Nov 21 Python
Django分页查询并返回jsons数据(中文乱码解决方法)
Aug 02 Python
pymongo中group by的操作方法教程
Mar 22 Python
python绘图模块matplotlib示例详解
Jul 26 Python
python中scrapy处理项目数据的实例分析
Nov 22 Python
用Python提取PDF表格的方法
Apr 11 Python
python实现socket简单通信的示例代码
Apr 13 Python
python 制作一个gui界面的翻译工具
May 14 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
apache+mysql+php+ssl服务器之完全安装攻略
2006/09/05 PHP
PHP+MYSQL的文章管理系统(二)
2006/10/09 PHP
PHP和Mysqlweb应用开发核心技术 第1部分 Php基础-1 开始了解php
2011/07/03 PHP
如何用php获取文件名后缀
2013/06/09 PHP
体育彩票排列三组选三算法分享
2014/03/07 PHP
PHP+Mysql实现多关键字与多字段生成SQL语句的函数
2014/11/05 PHP
smarty实现多级分类的方法
2014/12/05 PHP
PHP文件缓存smarty模板应用实例分析
2016/02/26 PHP
PHP编程获取各个时间段具体时间的方法
2017/05/26 PHP
jquery属性选择器not has怎么写 行悬停高亮显示
2013/11/13 Javascript
jquery实现效果比较好的table选中行颜色
2014/03/25 Javascript
jQuery简易图片放大特效示例代码
2014/06/09 Javascript
javascript中tostring()和valueof()的用法及两者的区别
2015/11/16 Javascript
AngularJS中$injector、$rootScope和$scope的概念和关联关系深入分析
2017/01/19 Javascript
Webpack中css-loader和less-loader的使用教程
2017/04/27 Javascript
JS解决IOS中拍照图片预览旋转90度BUG的问题
2017/09/13 Javascript
JS动画实现回调地狱promise的实例代码详解
2018/11/08 Javascript
JS如何实现动态添加的元素绑定事件
2019/11/12 Javascript
Vue移动端项目实现使用手机预览调试操作
2020/07/18 Javascript
Python中实现最小二乘法思路及实现代码
2018/01/04 Python
Tensorflow 自带可视化Tensorboard使用方法(附项目代码)
2018/02/10 Python
python hook监听事件详解
2018/10/25 Python
Flask框架搭建虚拟环境的步骤分析
2019/12/21 Python
Python matplotlib实时画图案例
2020/04/23 Python
CSS3中动画属性transform、transition和animation属性的区别
2016/09/25 HTML / CSS
全球领先的在线cosplay服装商店:RoleCosplay
2020/01/18 全球购物
Ibatis如何调用存储过程
2015/05/15 面试题
Python面试题集
2012/03/08 面试题
美工的岗位职责
2013/11/14 职场文书
企业家王石演讲稿:坚持与放下
2014/04/27 职场文书
查摆问题整改措施
2014/10/24 职场文书
2015年党风廉政建设责任书
2015/01/29 职场文书
满月酒邀请函
2015/01/30 职场文书
2015大学生党员自我评价范文
2015/03/03 职场文书
2015年乡镇安全生产工作总结
2015/05/19 职场文书
netty 实现tomcat的示例代码
2022/06/05 Servers