使用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实现rest请求api示例
Apr 22 Python
python实现简易通讯录修改版
Mar 13 Python
在Python中构建增广矩阵的实现方法
Jul 01 Python
python实现大文本文件分割
Jul 22 Python
django写用户登录判定并跳转制定页面的实例
Aug 21 Python
用Python爬取QQ音乐评论并制成词云图的实例
Aug 24 Python
python树的同构学习笔记
Sep 14 Python
Python + Flask 实现简单的验证码系统
Oct 01 Python
python如何控制进程或者线程的个数
Oct 16 Python
利用python做表格数据处理
Apr 13 Python
Python之matplotlib绘制饼图
Apr 13 Python
PyTorch中permute的使用方法
Apr 26 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 创建标签云函数代码
2010/05/26 PHP
PHP中限制IP段访问、禁止IP提交表单的代码
2011/04/23 PHP
php生成数字字母的验证码图片
2015/07/14 PHP
浅析onsubmit校验表单时利用ajax的return false无效问题
2013/07/10 Javascript
js 金额格式化来回转换示例
2014/02/23 Javascript
JavaScript检测实例属性, 原型属性
2015/02/04 Javascript
动态加载jQuery的两种方法实例分析
2015/07/17 Javascript
JS实现适合于后台使用的动画折叠菜单效果
2015/09/21 Javascript
JS+HTML5实现的前端购物车功能插件实例【附demo源码下载】
2016/10/17 Javascript
Vue中的v-cloak使用解读
2017/03/27 Javascript
vue 使用eventBus实现同级组件的通讯
2018/03/02 Javascript
Vue中$refs的用法详解
2018/06/24 Javascript
使用nodejs分离html文件里的js和css详解
2019/04/12 NodeJs
详解在vue-cli3.0中自定css、js和图片的打包路径
2019/08/26 Javascript
详解webpack打包vue项目之后生成的dist文件该怎么启动运行
2019/09/06 Javascript
关于better-scroll插件的无法滑动bug(2021通过插件解决)
2021/03/01 Javascript
python条件和循环的使用方法
2013/11/01 Python
Python的消息队列包SnakeMQ使用初探
2016/06/29 Python
django 发送手机验证码的示例代码
2018/04/25 Python
解决Python3 抓取微信账单信息问题
2019/07/19 Python
Pytorch mask-rcnn 实现细节分享
2020/06/24 Python
Django自带的用户验证系统实现
2020/12/18 Python
Crocs卡骆驰洞洞鞋日本官方网站:Crocs日本
2016/08/25 全球购物
欧舒丹比利时官网:L’OCCITANE比利时
2017/04/25 全球购物
业务员岗位职责
2013/11/16 职场文书
英语自我评价范文
2014/01/24 职场文书
先进个人事迹材料
2014/01/25 职场文书
致接力运动员广播稿
2014/02/17 职场文书
小学生中国梦演讲稿
2014/04/23 职场文书
2014年煤矿安全工作总结
2014/12/04 职场文书
鸦片战争观后感
2015/06/09 职场文书
“学党章、守党纪、讲党规”学习心得体会
2016/01/14 职场文书
分析Python感知线程状态的解决方案之Event与信号量
2021/06/16 Python
十大最强火系宝可梦,喷火龙上榜,第一名有双火属性
2022/03/18 日漫
教你在 Java 中实现 Dijkstra 最短路算法的方法
2022/04/08 Java/Android
Java时间工具类Date的常用处理方法
2022/05/25 Java/Android