使用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中实现贪婪排名算法的教程
Apr 17 Python
python使用Queue在多个子进程间交换数据的方法
Apr 18 Python
浅谈Python 的枚举 Enum
Jun 12 Python
Python通用循环的构造方法实例分析
Dec 19 Python
Python3爬虫之urllib携带cookie爬取网页的方法
Dec 28 Python
Python3日期与时间戳转换的几种方法详解
Jun 04 Python
在Django中预防CSRF攻击的操作
Mar 13 Python
Python3标准库之dbm UNIX键-值数据库问题
Mar 24 Python
Python分类测试代码实例汇总
Jul 23 Python
Python批量删除mysql中千万级大量数据的脚本分享
Dec 03 Python
python实现简单的学生管理系统
Feb 22 Python
基于python实现银行管理系统
Apr 20 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的PHP XML类
2006/10/09 PHP
解析Ubuntu下crontab命令的用法
2013/06/24 PHP
php中把美国时间转为北京时间的自定义函数分享
2014/07/28 PHP
innertext , insertadjacentelement , insertadjacenthtml , insertadjacenttext 等区别
2007/06/29 Javascript
nodejs入门详解(多篇文章结合)
2012/03/07 NodeJs
顶部缓冲下拉菜单导航特效的JS代码
2013/08/27 Javascript
JQueryiframe页面操作父页面中的元素与方法(实例讲解)
2013/11/19 Javascript
innerHTML在IE中报错解决方案
2014/12/15 Javascript
javascript下拉框选项单击事件的例子分享
2015/03/04 Javascript
深入分析Javascript跨域问题
2015/04/17 Javascript
javascript 闭包详解
2015/07/02 Javascript
实例详解jQuery的无new构建
2016/08/02 Javascript
window.open打开窗口被拦截的快速解决方法
2016/08/04 Javascript
AngularJS 实现弹性盒子布局的方法
2016/08/30 Javascript
JS树形菜单组件Bootstrap TreeView使用方法详解
2016/12/21 Javascript
jQuery基于xml格式数据实现模糊查询及分页功能的方法
2016/12/25 Javascript
jQuery实现复制到粘贴板功能
2017/02/11 Javascript
BootStrap fileinput.js文件上传组件实例代码
2017/02/20 Javascript
从零开始学习Node.js系列教程四:多页面实现的数学运算示例
2017/04/13 Javascript
微信小程序开发技巧汇总
2019/07/15 Javascript
Django接受前端数据的几种方法总结
2016/11/04 Python
sublime python3 输入换行不结束的方法
2018/04/19 Python
Python多进程与服务器并发原理及用法实例分析
2018/08/21 Python
python里 super类的工作原理详解
2019/06/19 Python
Python Pandas 获取列匹配特定值的行的索引问题
2019/07/01 Python
python中eval与int的区别浅析
2019/08/11 Python
通过实例解析python描述符原理作用
2020/01/22 Python
AmazeUI中各种的导航式菜单与解决方法
2020/08/19 HTML / CSS
Orvis官网:自1856年以来,优质服装、飞钓装备等
2018/12/17 全球购物
如何转换一个字符串到enum值
2014/04/12 面试题
生物制药自我鉴定
2014/01/25 职场文书
开工仪式策划方案
2014/05/23 职场文书
厨师长岗位职责范本
2014/08/25 职场文书
费城故事观后感
2015/06/10 职场文书
postgresql 删除重复数据案例详解
2021/08/02 PostgreSQL
Kubernetes中Deployment的升级与回滚
2022/04/01 Servers