使用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 sys.path详细介绍
Oct 17 Python
深入解析Python编程中JSON模块的使用
Oct 15 Python
实例解析Python的Twisted框架中Deferred对象的用法
May 25 Python
彻底理解Python list切片原理
Oct 27 Python
Python弹出输入框并获取输入值的实例
Jun 18 Python
Python3网络爬虫开发实战之极验滑动验证码的识别
Aug 02 Python
python3.7 openpyxl 删除指定一列或者一行的代码
Oct 08 Python
Django使用rest_framework写出API
May 21 Python
Django如何实现防止XSS攻击
Oct 13 Python
记一次python 爬虫爬取深圳租房信息的过程及遇到的问题
Nov 24 Python
python 用pandas实现数据透视表功能
Dec 21 Python
使用Selenium实现微博爬虫(预登录、展开全文、翻页)
Apr 13 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
第十二节 类的自动加载 [12]
2006/10/09 PHP
PHP 加密解密内部算法
2010/04/22 PHP
php使用ftp实现文件上传与下载功能
2017/07/21 PHP
Thinkphp框架使用list_to_tree 实现无限级分类列出所有节点示例
2020/04/04 PHP
IE和Mozilla的兼容性汇总event
2007/08/12 Javascript
如何解决Jquery库及其他库之间的$命名冲突
2013/09/15 Javascript
禁止空格提交表单的js代码
2013/11/17 Javascript
选择复选框按钮置灰否则按钮可用
2014/05/22 Javascript
jQuery中append()方法用法实例
2015/01/08 Javascript
jQuery延迟加载图片插件Lazy Load使用指南
2015/03/25 Javascript
JavaScript中的冒泡排序法
2016/08/03 Javascript
关于angularJs指令的Scope(作用域)介绍
2016/10/25 Javascript
jquery拖动改变div大小
2017/07/04 jQuery
vue.js实现格式化时间并每秒更新显示功能示例
2018/07/07 Javascript
jQuery cookie的公共方法封装和使用示例
2020/06/01 jQuery
解决vscode进行vue格式化,会自动补分号和双引号的问题
2020/10/26 Javascript
[56:58]VP vs Optic 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
Python Queue模块详细介绍及实例
2016/12/27 Python
Django项目中model的数据处理以及页面交互方法
2018/05/30 Python
python 限制函数执行时间,自己实现timeout的实例
2019/01/12 Python
用Python实现BP神经网络(附代码)
2019/07/10 Python
python opencv 简单阈值算法的实现
2019/08/04 Python
Django查询优化及ajax编码格式原理解析
2020/03/25 Python
python实现图像全景拼接
2020/03/27 Python
Python 炫技操作之合并字典的七种方法
2020/04/10 Python
python读取excel数据绘制简单曲线图的完整步骤记录
2020/10/30 Python
h5实现获取用户地理定位的实例代码
2017/07/17 HTML / CSS
南京某软件公司的.net面试题
2015/11/30 面试题
LINUX下线程,GDI类的解释
2016/12/14 面试题
体育专业个人的求职信范文
2013/09/21 职场文书
初中考试作弊检讨书
2014/02/01 职场文书
母亲节感恩寄语
2014/02/21 职场文书
报关员个人职业生涯规划书
2014/03/12 职场文书
大学生就业推荐表自我评价
2015/03/02 职场文书
自主招生自荐信格式
2015/03/04 职场文书
会计试用期自我评价
2015/03/10 职场文书