使用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 实现插入排序算法
Jun 05 Python
更改Python命令行交互提示符的方法
Jan 14 Python
python实现定时播放mp3
Mar 29 Python
Python中字典的基本知识初步介绍
May 21 Python
python使用Tkinter实现在线音乐播放器
Jan 30 Python
Numpy掩码式数组详解
Apr 17 Python
利用python如何处理百万条数据(适用java新手)
Jun 06 Python
使用python实现http及ftp服务进行数据传输的方法
Oct 26 Python
Python 将 QQ 好友头像生成祝福语的实现代码
May 03 Python
Django跨域请求原理及实现代码
Nov 14 Python
使用pandas生成/读取csv文件的方法实例
Jul 09 Python
Python自动化工具之实现Excel转Markdown表格
Apr 08 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
百事可乐也出咖啡了 双倍咖啡因双倍快乐
2021/03/03 咖啡文化
PHP的FTP学习(三)
2006/10/09 PHP
Zend Framework入门教程之Zend_Config组件用法详解
2016/12/09 PHP
精选的10款用于构建良好易用性网站的jQuery插件
2011/01/23 Javascript
js面向对象 多种创建对象方法小结
2012/05/21 Javascript
jQuery实现点击标题输入详细信息
2013/04/16 Javascript
javascript动态的改变IFrame的高度实现自动伸展
2013/10/12 Javascript
jQuery学习之prop和attr的区别示例介绍
2013/11/15 Javascript
JavaScript检测鼠标移动方向的方法
2015/05/22 Javascript
JavaScript实现把rgb颜色转换成16进制颜色的方法
2015/06/01 Javascript
再JavaScript的jQuery库中编写动画效果的指南
2015/08/13 Javascript
举例讲解JavaScript substring()的使用方法
2015/11/09 Javascript
浅谈jQuery animate easing的具体使用方法(推荐)
2016/06/17 Javascript
BootStrap Table 获取同行不同列元素的方法
2016/12/19 Javascript
原生JS实现图片轮播效果
2016/12/26 Javascript
js实现按座位号抽奖
2017/04/05 Javascript
详解vue.js2.0父组件点击触发子组件方法
2017/05/10 Javascript
vue+webpack实现异步组件加载的方法
2018/02/03 Javascript
原生JS实现天气预报
2020/06/16 Javascript
vue中解决chrome浏览器自动播放音频和MP3语音打包到线上的实现方法
2020/10/09 Javascript
python有证书的加密解密实现方法
2014/11/19 Python
python3使用SMTP发送简单文本邮件
2018/06/19 Python
Python 使用PyQt5 完成选择文件或目录的对话框方法
2019/06/27 Python
Django如何实现上传图片功能
2019/08/16 Python
Django搭建项目实战与避坑细节详解
2020/12/06 Python
加拿大最大的书店:Indigo
2017/01/01 全球购物
中国制造网:Made-in-China.com
2019/10/25 全球购物
银行财务部实习生的自我鉴定
2013/11/27 职场文书
银行实习的自我鉴定
2013/12/10 职场文书
班级安全教育实施方案
2014/02/23 职场文书
高中生家长寄语大全
2014/04/03 职场文书
药品营销专业毕业生自荐信
2014/07/02 职场文书
2014教师专业技术工作总结
2014/12/03 职场文书
离婚协议书的范本
2015/01/27 职场文书
vue3使用vuedraggable实现拖拽功能
2022/04/06 Vue.js
输入框跟随文字内容适配宽实现示例
2022/08/14 Javascript