使用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网络编程之数据传输UDP实例分析
May 20 Python
在Python操作时间和日期之asctime()方法的使用
May 22 Python
详解Python中映射类型的内建函数和工厂函数
Aug 19 Python
django将图片上传数据库后在前端显式的方法
May 25 Python
python实现自动发送邮件
Jun 20 Python
Python统计纯文本文件中英文单词出现个数的方法总结【测试可用】
Jul 25 Python
使用pyshp包进行shapefile文件修改的例子
Dec 06 Python
Python 使用threading+Queue实现线程池示例
Dec 21 Python
Django+RestFramework API接口及接口文档并返回json数据操作
Jul 12 Python
Python+Opencv身份证号码区域提取及识别实现
Aug 25 Python
python3:excel操作之读取数据并返回字典 + 写入的案例
Sep 01 Python
pycharm配置安装autopep8自动规范代码的实现
Mar 02 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
基于mysql的论坛(5)
2006/10/09 PHP
yii通过小物件生成view的方法
2016/10/08 PHP
自制PHP框架之路由与控制器
2017/05/07 PHP
关于laravel模板中生成URL的几种模式总结
2019/10/18 PHP
php使用redis的有序集合zset实现延迟队列应用示例
2020/02/20 PHP
php中try catch捕获异常实例详解
2020/08/06 PHP
php模拟post提交请求调用接口示例解析
2020/08/07 PHP
jquery 学习笔记 传智博客佟老师附详细注释
2020/09/12 Javascript
不安全的常用的js写法
2009/09/15 Javascript
滚动图片效果 jquery实现回旋滚动效果
2013/01/08 Javascript
jquery遍历select元素(实例讲解)
2013/12/31 Javascript
JavaScript实现数字数组正序排列的方法
2015/04/06 Javascript
JavaScript节点及列表操作实例小结
2015/08/05 Javascript
jQuery弹出遮罩层效果完整示例
2016/09/13 Javascript
最好用的Bootstrap fileinput.js文件上传组件
2016/12/12 Javascript
微信小程序 轮播图swiper详解及实例(源码下载)
2017/01/11 Javascript
基于JavaScript实现拖动滑块效果
2017/02/16 Javascript
js 开发之autocomplete=&quot;off&quot;在chrom中失效的解决办法
2017/09/28 Javascript
echarts学习笔记之图表自适应问题详解
2017/11/22 Javascript
JavaScript常用数学函数用法示例
2018/05/14 Javascript
swiper.js插件实现pc端文本上下滑动功能示例
2018/12/03 Javascript
详解Vue This$Store总结
2018/12/17 Javascript
解决vue 单文件组件中样式加载问题
2019/04/24 Javascript
vue中实现点击按钮滚动到页面对应位置的方法(使用c3平滑属性实现)
2019/12/29 Javascript
[02:54]DOTA2英雄基础教程 暗影牧师戴泽
2013/12/05 DOTA
python thread 并发且顺序运行示例
2009/04/09 Python
在Python上基于Markov链生成伪随机文本的教程
2015/04/17 Python
Python处理文本文件中控制字符的方法
2017/02/07 Python
python thrift搭建服务端和客户端测试程序
2018/01/17 Python
如何优雅地处理Django中的favicon.ico图标详解
2018/07/05 Python
对Python中的条件判断、循环以及循环的终止方法详解
2019/02/08 Python
python字符串查找函数的用法详解
2019/07/08 Python
HTML5 Canvas画线技巧——实现绘制一个像素宽的细线
2013/08/02 HTML / CSS
护士自我评价
2014/02/01 职场文书
24年收藏2000多部退役军用电台
2022/02/18 无线电
JAVA SpringMVC实现自定义拦截器
2022/03/16 Python