使用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检测手机QQ在线状态的脚本代码
Feb 10 Python
python显示天气预报
Mar 02 Python
六个窍门助你提高Python运行效率
Jun 09 Python
[原创]pip和pygal的安装实例教程
Dec 07 Python
答题辅助python代码实现
Jan 16 Python
对Python中TKinter模块中的Label组件实例详解
Jun 14 Python
简单了解为什么python函数后有多个括号
Dec 19 Python
python dataframe NaN处理方式
Dec 26 Python
使用 PyTorch 实现 MLP 并在 MNIST 数据集上验证方式
Jan 08 Python
python实现IOU计算案例
Apr 12 Python
python爬虫把url链接编码成gbk2312格式过程解析
Jun 08 Python
Tensorflow tensor 数学运算和逻辑运算方式
Jun 30 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扩展
2013/06/13 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(十四)
2014/06/26 PHP
php判断并删除空目录及空子目录的方法
2015/02/11 PHP
php随机显示指定文件夹下图片的方法
2015/07/13 PHP
实例详解PHP中html word 互转的方法
2016/01/28 PHP
xml分页+ajax请求数据源+dom取结果实例代码
2008/10/31 Javascript
jquery CSS选择器笔记
2010/03/29 Javascript
js 判断checkbox是否选中的实现代码
2010/11/23 Javascript
Prototype源码浅析 Enumerable部分(二)
2012/01/18 Javascript
jquery 插件学习(二)
2012/08/06 Javascript
如何用js控制frame的隐藏或显示的解决办法
2013/03/20 Javascript
为何JS操作的href都是javascript:void(0);呢
2015/11/12 Javascript
javascript html5移动端轻松实现文件上传
2020/03/27 Javascript
jQuery实现拖动剪裁图片作为头像
2016/12/28 Javascript
Angular2.js实现表单验证详解
2017/06/23 Javascript
js代码规范之Eslint安装与配置详解
2018/09/08 Javascript
JavaScript实现随机点名器实例详解
2019/05/07 Javascript
详解钉钉小程序组件之自定义模态框(弹窗封装实现)
2020/03/07 Javascript
Vue+elementUI实现多图片上传与回显功能(含回显后继续上传或删除)
2020/03/23 Javascript
如何解决vue在ios微信&quot;复制链接&quot;功能问题
2020/03/26 Javascript
在Python的Flask框架中使用模版的入门教程
2015/04/20 Python
Python学习小技巧之列表项的拼接
2017/05/20 Python
Python+OpenCV感兴趣区域ROI提取方法
2019/01/10 Python
使用Python制作表情包实现换脸功能
2019/07/19 Python
python多线程+代理池爬取天天基金网、股票数据过程解析
2019/08/13 Python
利用keras加载训练好的.H5文件,并实现预测图片
2020/01/24 Python
什么是Python中的匿名函数
2020/06/02 Python
Python爬虫之Selenium设置元素等待的方法
2020/12/04 Python
世界上最大的皮肤科医生拥有和经营的美容网站:LovelySkin
2021/01/03 全球购物
请说出以下代码输出什么
2013/08/30 面试题
中专自荐信
2013/10/13 职场文书
开工典礼策划方案
2014/05/23 职场文书
学雷锋活动总结报告
2014/06/26 职场文书
投资意向协议书
2015/01/29 职场文书
小学生安全保证书
2015/05/09 职场文书
公司趣味运动会开幕词
2016/03/04 职场文书