使用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实现异步回调机制代码分享
Jan 10 Python
Python实现二叉树结构与进行二叉树遍历的方法详解
May 24 Python
Python批量生成特定尺寸图片及图画任意文字的实例
Jan 30 Python
机器学习实战之knn算法pandas
Jun 22 Python
Python 实现数据结构-堆栈和队列的操作方法
Jul 17 Python
python自动保存百度盘资源到百度盘中的实例代码
Aug 26 Python
Pytorch实现LSTM和GRU示例
Jan 14 Python
基于Python生成个性二维码过程详解
Mar 05 Python
Python3之外部文件调用Django程序操作model等文件实现方式
Apr 07 Python
keras 实现轻量级网络ShuffleNet教程
Jun 19 Python
Python+Xlwings 删除Excel的行和列
Dec 19 Python
python的列表生成式,生成器和generator对象你了解吗
Mar 16 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
给apache2.2加上mod_encoding模块後 php5.2.0 处理url出现bug
2007/04/12 PHP
php实现博客,论坛图片防盗链的方法
2016/10/15 PHP
PHP通过文件保存和更新信息的方法分析
2019/09/12 PHP
取得父标签
2006/11/14 Javascript
JavaScript DOM 学习第二章 编辑文本
2010/02/19 Javascript
jQuery animate easing使用方法图文详解
2016/06/17 Javascript
jQuery实现CheckBox全选、全不选功能
2017/01/11 Javascript
解决vue-cli中stylus无法使用的问题方法
2017/06/19 Javascript
vue router-link传参以及参数的使用实例
2017/11/10 Javascript
node.js的Express服务器基本使用教程
2019/01/09 Javascript
js实现无限瀑布流实例方法
2019/09/16 Javascript
vue.js页面加载执行created,mounted的先后顺序说明
2020/11/07 Javascript
Python程序设计入门(5)类的使用简介
2014/06/16 Python
Python实现大文件排序的方法
2015/07/10 Python
python3 与python2 异常处理的区别与联系
2016/06/19 Python
Python进程间通信之共享内存详解
2017/10/30 Python
python列表的增删改查实例代码
2018/01/30 Python
python生成n个元素的全组合方法
2018/11/13 Python
Python实现的读取文件内容并写入其他文件操作示例
2019/04/09 Python
Python中查看变量的类型内存地址所占字节的大小
2019/06/26 Python
python同时替换多个字符串方法示例
2019/09/17 Python
python同义词替换的实现(jieba分词)
2020/01/21 Python
pandas分组聚合详解
2020/04/10 Python
获取python运行输出的数据并解析存为dataFrame实例
2020/07/07 Python
贝斯特韦斯特酒店集团官网:Best Western
2019/01/03 全球购物
香港零食网购:上仓胃子
2020/06/08 全球购物
骨干教师培训感言
2014/01/16 职场文书
保安公司服务承诺书
2014/05/28 职场文书
乒乓球兴趣小组活动总结
2014/07/08 职场文书
国庆横幅标语
2014/10/08 职场文书
2014年财政所工作总结
2014/11/22 职场文书
夫妻分居协议书范本
2014/11/28 职场文书
2015年社区综治宣传月活动总结
2015/03/25 职场文书
python实现对doc、txt、xls等文档的读写操作
2022/04/02 Python
Spring Data JPA框架持久化存储数据到数据库
2022/04/28 Java/Android
Valheim服务器 Mod修改安装教程 【ValheimPlus】
2022/12/24 Servers