使用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标准库内置函数complex介绍
Nov 25 Python
python中Flask框架简单入门实例
Mar 21 Python
Python复制文件操作实例详解
Nov 10 Python
分享python数据统计的一些小技巧
Jul 21 Python
python实现决策树ID3算法的示例代码
May 30 Python
python简单区块链模拟详解
Jul 03 Python
pandas DataFrame创建方法的方式
Aug 02 Python
简单了解python协程的相关知识
Aug 31 Python
Python + Requests + Unittest接口自动化测试实例分析
Dec 12 Python
将matplotlib绘图嵌入pyqt的方法示例
Jan 08 Python
Python3中的f-Strings增强版字符串格式化方法
Mar 04 Python
聊聊python中的循环遍历
Sep 07 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 chmod 函数与批量修改文件目录权限
2010/05/10 PHP
PHP入门学习笔记之一
2010/10/12 PHP
Ajax实时验证用户名/邮箱等是否已经存在的代码打包
2011/12/01 PHP
用mysql_fetch_array()获取当前行数据的方法详解
2013/06/05 PHP
百度工程师讲PHP函数的实现原理及性能分析(一)
2015/05/13 PHP
javascript 面向对象编程 function也是类
2009/09/17 Javascript
js常用代码段整理
2011/11/30 Javascript
JS中的eval 为什么加括号
2016/04/13 Javascript
vue,angular,avalon这三种MVVM框架优缺点
2016/04/27 Javascript
原生js仿jquery一些常用方法(必看篇)
2016/09/20 Javascript
bootstrap table复杂操作代码
2016/11/01 Javascript
jQuey将序列化对象在前台显示地实现代码(方法总结)
2016/12/13 Javascript
详解Angularjs 如何自定义Img的ng-load 事件
2017/02/15 Javascript
jquery中each循环的简单回滚操作
2017/05/05 jQuery
node.js中EJS 模板快速入门教程
2017/05/08 Javascript
Underscore之Array_动力节点Java学院整理
2017/07/10 Javascript
微信小程序自定义prompt组件步骤详解
2018/06/12 Javascript
微信小程序网络请求封装示例
2018/07/24 Javascript
vue实现div拖拽互换位置
2020/07/29 Javascript
微信小程序如何使用globalData的方法
2019/06/06 Javascript
vue 输入电话号码自动按3-4-4分割功能的实现代码
2020/04/30 Javascript
vue+openlayers绘制省市边界线
2020/12/24 Vue.js
Python使用函数默认值实现函数静态变量的方法
2014/08/18 Python
python基于urllib实现按照百度音乐分类下载mp3的方法
2015/05/25 Python
深入浅析ImageMagick命令执行漏洞
2016/10/11 Python
Django 实现admin后台显示图片缩略图的例子
2019/07/28 Python
pytorch获取模型某一层参数名及参数值方式
2019/12/30 Python
详解Python模块化编程与装饰器
2021/01/16 Python
CSS3的Flexbox布局的简明入门指南
2016/04/08 HTML / CSS
美国高级音响品牌:Master&Dynamic
2018/07/05 全球购物
Final类有什么特点
2012/04/25 面试题
工程承包协议书
2014/04/22 职场文书
关于读书的演讲稿300字
2014/08/27 职场文书
考试作弊检讨
2015/01/27 职场文书
学校社团活动总结
2015/05/07 职场文书
刑事上诉状范文
2015/05/22 职场文书