使用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实用日期时间处理方法汇总
May 09 Python
Python通过poll实现异步IO的方法
Jun 04 Python
Python实现比较两个列表(list)范围
Jun 12 Python
python中正则的使用指南
Dec 04 Python
教你用一行Python代码实现并行任务(附代码)
Feb 02 Python
python实现自动登录
Sep 17 Python
python数据结构学习之实现线性表的顺序
Sep 28 Python
Python configparser模块操作代码实例
Jun 08 Python
终于搞懂了Keras中multiloss的对应关系介绍
Jun 22 Python
Python word文本自动化操作实现方法解析
Nov 05 Python
python excel多行合并的方法
Dec 09 Python
python如何利用cv2.rectangle()绘制矩形框
Dec 24 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中文字符串截断无乱码解决方法
2016/10/10 PHP
Laravel框架分页实现方法分析
2018/06/12 PHP
thinkPHP5.1框架中Request类四种调用方式示例
2019/08/03 PHP
PHP7新特性
2021/03/09 PHP
超简单的jquery的AJAX用法
2010/05/10 Javascript
juqery 学习之三 选择器 子元素与表单
2010/11/25 Javascript
IE中jquery.form中ajax提交没反应解决方法分享
2012/09/11 Javascript
绑定回车enter事件代码
2014/05/18 Javascript
Egret引擎开发指南之视觉编程
2014/09/03 Javascript
jQuery中noConflict()用法实例分析
2015/02/08 Javascript
JavaScript的RequireJS库入门指南
2015/07/01 Javascript
浅谈JavaScript中的string拥有方法的原因
2015/08/28 Javascript
javascript实现html页面之间参数传递的四种方法实例分析
2015/12/15 Javascript
JavaScript tab选项卡插件实例代码
2016/02/23 Javascript
jQuery 获取屏幕高度、宽度的简单实现案例
2016/05/17 Javascript
浅谈jQuery操作类数组的工具方法
2016/12/23 Javascript
vue结合axios与后端进行ajax交互的方法
2018/07/06 Javascript
express启用https使用小记
2019/05/21 Javascript
浅谈Python使用Bottle来提供一个简单的web服务
2017/12/27 Python
Django页面数据的缓存与使用的具体方法
2019/04/23 Python
python给图像加上mask,并提取mask区域实例
2020/01/19 Python
python 解决Fatal error in launcher:错误问题
2020/05/21 Python
python在地图上画比例的实例详解
2020/11/13 Python
香港交友网站:be2香港
2018/07/22 全球购物
bonprix匈牙利:女士、男士和儿童服装
2019/07/19 全球购物
SEPHORA丝芙兰德国官方购物网站:化妆品、护肤品和香水
2020/01/21 全球购物
几个数据库方面的面试题
2016/07/01 面试题
Python文件操作的面试题
2013/06/22 面试题
招商业务员岗位职责
2013/12/16 职场文书
会计系个人求职信范文分享
2013/12/20 职场文书
2014领导班子四风问题对照检查材料思想汇报
2014/09/21 职场文书
优秀党员申报材料
2014/12/18 职场文书
教师文明餐桌光盘行动倡议书
2015/04/28 职场文书
2016年教师节贺卡寄语
2015/12/04 职场文书
CSS3 制作精美的定价表
2021/04/06 HTML / CSS
vue中的可拖拽宽度div的实现示例
2022/04/08 Vue.js