使用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爬取亚马逊书籍信息代码分享
Dec 09 Python
Python类的继承和多态代码详解
Dec 27 Python
Python多线程扫描端口代码示例
Feb 09 Python
python代码过长的换行方法
Jul 19 Python
python 为什么说eval要慎用
Mar 26 Python
python+numpy按行求一个二维数组的最大值方法
Jul 09 Python
Python Numpy库datetime类型的处理详解
Jul 13 Python
Python制作词云图代码实例
Sep 09 Python
利用django model save方法对未更改的字段依然进行了保存
Mar 28 Python
python3 logging日志封装实例
Apr 08 Python
Python datetime模块使用方法小结
Jun 18 Python
python开发一个解析protobuf文件的简单编译器
Nov 17 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
用windows下编译过的eAccelerator for PHP 5.1.6实现php加速的使用方法
2007/09/30 PHP
PHP关键特性之命名空间实例详解
2017/05/06 PHP
为何说PHP引用是个坑,要慎用
2018/04/02 PHP
laravel实现上传图片,并且制作缩略图,按照日期存放的代码
2019/10/16 PHP
js下写一个事件队列操作函数
2010/07/19 Javascript
Windows下用PyCharm和Visual Studio开始Python编程
2015/10/26 Javascript
Node.js实用代码段之正确拼接Buffer
2016/03/17 Javascript
Nodejs+Socket.io实现通讯实例代码
2017/02/13 NodeJs
JavaScript中的遍历详解(多种遍历)
2017/04/07 Javascript
JS实现批量上传文件并显示进度功能
2017/06/27 Javascript
自定义vue组件发布到npm的方法
2018/05/09 Javascript
vue 对象添加或删除成员时无法实时更新的解决方法
2019/05/01 Javascript
Layui表格行工具事件与数据回填方法
2019/09/13 Javascript
[01:04:32]DOTA2-DPC中国联赛 正赛 Aster vs LBZS BO3 第二场 2月23日
2021/03/11 DOTA
Python实现拼接多张图片的方法
2014/12/01 Python
进一步探究Python中的正则表达式
2015/04/28 Python
用Python编写web API的教程
2015/04/30 Python
web.py在SAE中的Session问题解决方法(使用mysql存储)
2015/06/24 Python
在Python中marshal对象序列化的相关知识
2015/07/01 Python
django使用xadmin的全局配置详解
2019/11/15 Python
结合 CSS3 transition transform 实现简单的跑马灯效果的示例
2018/02/07 HTML / CSS
澳大利亚首屈一指的在线购物目的地:Kogan.com
2017/02/02 全球购物
英超联赛的首选足球:Mitre足球
2019/05/06 全球购物
Unineed旗下时尚轻奢网站:FABHunt
2019/05/13 全球购物
Interrail法国:乘火车探索欧洲,最受欢迎的欧洲铁路通票
2019/08/27 全球购物
试用期员工考核制度
2014/01/22 职场文书
优秀教师自我评价范文
2014/09/27 职场文书
2014年实习班主任工作总结
2014/11/08 职场文书
党员自我评价范文2015
2015/03/03 职场文书
违规违纪检讨书范文
2015/05/06 职场文书
消防安全月活动总结
2015/05/08 职场文书
2015年机关纠风工作总结
2015/05/15 职场文书
演讲比赛通讯稿
2015/07/18 职场文书
心理健康教育培训研修感言
2015/11/18 职场文书
2016年劳模先进事迹材料
2016/02/25 职场文书
CSS filter 有什么神奇用途
2021/05/25 HTML / CSS