使用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 22 Python
python画图--输出指定像素点的颜色值方法
Jul 03 Python
Django使用unittest模块进行单元测试过程解析
Aug 02 Python
python multiprocessing多进程变量共享与加锁的实现
Oct 02 Python
python实现输入的数据在地图上生成热力图效果
Dec 06 Python
Pytorch evaluation每次运行结果不同的解决
Jan 02 Python
python不相等的两个字符串的 if 条件判断为True详解
Mar 12 Python
Python Selenium实现无可视化界面过程解析
Aug 25 Python
python实现测试工具(一)——命令行发送get请求
Oct 19 Python
python定时截屏实现
Nov 02 Python
Django权限控制的使用
Jan 07 Python
pandas时间序列之pd.to_datetime()的实现
Jun 16 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
LAMP环境使用Composer安装Laravel的方法
2017/03/25 PHP
JavaScript TO HTML 转换
2006/06/26 Javascript
ExtJS GridPanel 根据条件改变字体颜色
2010/03/08 Javascript
JS写的贪吃蛇游戏(个人练习)
2013/07/08 Javascript
JQuery的自定义事件代码,触发,绑定简单实例
2013/08/01 Javascript
JS+CSS实现淡入式焦点图片幻灯切换效果的方法
2015/02/26 Javascript
JS工作中的小贴士之”闭包“与事件委托的”阻止冒泡“
2016/06/16 Javascript
微信小程序 自定义对话框实例详解
2017/01/20 Javascript
node作为中间服务层如何发送请求(发送请求的实现方法详解)
2018/01/02 Javascript
解决vue页面刷新或者后退参数丢失的问题
2018/03/13 Javascript
node中使用es6/7/8(支持性与性能)
2019/03/28 Javascript
TypeScript中的方法重载详解
2019/04/12 Javascript
微信小程序实现星级评价
2019/11/20 Javascript
关于小程序优化的一些建议(小结)
2020/12/10 Javascript
[06:33]3.19 DOTA2发布会 海涛、冷冷、2009见证希望
2014/03/21 DOTA
极简的Python入门指引
2015/04/01 Python
浅析Python中signal包的使用
2015/11/13 Python
打包发布Python模块的方法详解
2016/09/18 Python
Django接受前端数据的几种方法总结
2016/11/04 Python
Python面向对象编程基础解析(一)
2017/10/26 Python
Python3随机漫步生成数据并绘制
2018/08/27 Python
浅谈Python大神都是这样处理XML文件的
2019/05/31 Python
代码实例讲解python3的编码问题
2019/07/08 Python
Python  Django 母版和继承解析
2019/08/09 Python
基于python+selenium的二次封装的实现
2020/01/06 Python
Django中从mysql数据库中获取数据传到echarts方式
2020/04/07 Python
Python中实现输入一个整数的案例
2020/05/03 Python
解决pycharm导入本地py文件时,模块下方出现红色波浪线的问题
2020/06/01 Python
Python大批量搜索引擎图像爬虫工具详解
2020/11/16 Python
HTML5中form如何关闭自动完成功能的方法
2018/07/02 HTML / CSS
Linux的主要特性
2016/09/03 面试题
大学生职业生涯规划书模板
2014/01/18 职场文书
《鸟岛》教学反思
2014/04/26 职场文书
企业安全标语
2014/06/07 职场文书
个人违纪检讨书
2014/09/15 职场文书
学生检讨书范文
2015/01/27 职场文书