使用python求解二次规划的问题


Posted in Python onFebruary 29, 2020

Python中支持Convex Optimization(凸规划)的模块为CVXOPT,其安装方式为:

pip install cvxopt

一、数学基础

二次型

二次型(quadratic form):n个变量的二次多项式称为二次型,即在一个多项式中,未知数的个数为任意多个,但每一项的次数都为2的多项式。其基本形式如下

使用python求解二次规划的问题

亦可写作,使用python求解二次规划的问题 ,称作二次型的矩阵表示,其中A是对称矩阵。仿照如下的定义,我们可以直接在其基本形式和矩阵表示之间相互转化。

使用python求解二次规划的问题

2.正定矩阵

设A是n阶实对称矩阵, 如果对任意一非零实向量X,都使二次型使用python求解二次规划的问题 成立,则称f(X)为正定二次型,矩阵A称为正定矩阵(Positive Definite),A为正定矩阵。

相应的,如果对任意一非零实向量X,都使二次型使用python求解二次规划的问题成立,则称f(X)为半正定二次型,A为半正定矩阵。

3.二次规划问题

二次规划是指,带有二次型目标函数和约束条件的最优化问题。其标准形式如下:

使用python求解二次规划的问题

即在Gx<h 和Ax=b的约束下,最小化目标函数。其中,当P是正定矩阵时,目标函数存在全局唯一最优解;P是半正定矩阵时,目标函数是凸函数,存在全局最优解(不唯一);P是不定矩阵时,目标函数非凸,存在多个局部最小值和稳定点,为np难问题。(本篇博客中我们不考虑非正定情况)。

二、python程序求解

工具包:Cvxopt python 凸优化包

函数原型:Cvxopt.solvers.qp(P,q,G,h,A,b)

P,q,G,h,A,b的含义参见上面的二次规划问题标准形式。

编程求解思路:

1.对于一个给定的二次规划问题,先转换为标准形式(参见数学基础中所讲的二次型二中形式转换)

2.对照标准形势,构建出矩阵P,q,G,h,A,b

3.调用result=Cvxopt.solvers.qp(P,q,G,h,A,b)求解

4.print(result)查看结果,其中result是一个字典,我们可直接获得其某个属性,e.g. print(result['x'])

下面我们来看一个例子

使用python求解二次规划的问题

import pprint
from cvxopt import matrix, solvers
P = matrix([[4.0,1.0],[1.0,2.0]])
q = matrix([1.0,1.0])
G = matrix([[-1.0,0.0],[0.0,-1.0]])
h = matrix([0.0,0.0])
A = matrix([1.0,1.0],(1,2))#原型为cvxopt.matrix(array,dims),等价于A = matrix([[1.0],[1.0]])
b = matrix([1.0])
result = solvers.qp(P,q,G,h,A,b)
 
print('x\n',result['x'])

运行结果:

使用python求解二次规划的问题

注意事项:

cvxopt.matrix与numpy.matrix的排列顺序不同,其中cvxopt.matrix是列优先,numpy.matrix是行优先。具体可见下面实例

import numpy as np
from cvxopt import matrix
a = np.matrix([[1,2],[3,4]])
b = matrix([[1,2],[3,4]])
print('numpy.matrix',a)
print('cvxopt.matrix',b)

运行结果:

使用python求解二次规划的问题

以上这篇使用python求解二次规划的问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python实现ip查询示例
Mar 26 Python
在Python下利用OpenCV来旋转图像的教程
Apr 16 Python
Django Admin实现上传图片校验功能
Mar 06 Python
Python 实现引用其他.py文件中的类和类的方法
Apr 29 Python
对python中xlsx,csv以及json文件的相互转化方法详解
Dec 25 Python
解决Python plt.savefig 保存图片时一片空白的问题
Jan 10 Python
python GUI实现小球满屏乱跑效果
May 09 Python
Python实现的服务器示例小结【单进程、多进程、多线程、非阻塞式】
May 23 Python
Python手绘可视化工具cutecharts使用实例
Dec 05 Python
python使用numpy实现直方图反向投影示例
Jan 17 Python
浅谈cv2.imread()和keras.preprocessing中的image.load_img()区别
Jun 12 Python
在Pytorch中使用Mask R-CNN进行实例分割操作
Jun 24 Python
Python龙贝格法求积分实例
Feb 29 #Python
python计算导数并绘图的实例
Feb 29 #Python
细数nn.BCELoss与nn.CrossEntropyLoss的区别
Feb 29 #Python
Pytorch对Himmelblau函数的优化详解
Feb 29 #Python
Pytorch中的自动求梯度机制和Variable类实例
Feb 29 #Python
在pytorch中实现只让指定变量向后传播梯度
Feb 29 #Python
浅谈Pytorch中的自动求导函数backward()所需参数的含义
Feb 29 #Python
You might like
阿拉伯的咖啡与水烟
2021/03/03 咖啡文化
php in_array 函数使用说明与in_array需要注意的地方说明
2010/04/13 PHP
php去除换行符的方法小结(PHP_EOL变量的使用)
2013/02/16 PHP
php中时间函数date及常用的时间计算
2017/05/12 PHP
对laravel的csrf 防御机制详解,及form中csrf_token()的存在介绍
2019/10/24 PHP
Firefox和IE浏览器兼容JS脚本写法小结
2008/07/07 Javascript
jQuery AJAX 调用WebService实现代码
2010/03/24 Javascript
兼容IE、FireFox、Chrome等浏览器的xml处理函数js代码
2011/11/30 Javascript
用Javascript评估用户输入密码的强度(Knockout版)
2011/11/30 Javascript
jQuery表单验证插件formValidator(改进版)
2012/02/03 Javascript
从数据结构分析看:用for each...in 比 for...in 要快些
2013/04/17 Javascript
JS判断数组中是否有重复值得三种实用方法
2013/08/16 Javascript
基于jquery异步传输json数据格式实例代码
2013/11/23 Javascript
javascript使用prototype完成单继承
2014/12/24 Javascript
PageSwitch插件实现100种不同图片切换效果
2015/07/28 Javascript
深入理解javascript作用域第二篇之词法作用域和动态作用域
2016/07/24 Javascript
BootStrap iCheck插件全选与获取value值的解决方法
2016/08/24 Javascript
Angular 常用指令实例总结整理
2016/12/13 Javascript
ES6学习教程之对象的扩展详解
2017/05/02 Javascript
基于easyui checkbox 的一些操作处理方法
2017/07/10 Javascript
js中DOM事件绑定分析
2018/03/18 Javascript
在vue中使用Autoprefixed的方法
2018/07/27 Javascript
Vue 根据条件判断van-tab的显示方式
2020/08/03 Javascript
python多线程操作实例
2014/11/21 Python
python判断字符串是否是json格式方法分享
2017/11/07 Python
Python数据类型中的“冒号“[::]——分片与步长操作示例
2018/01/24 Python
Python3.6笔记之将程序运行结果输出到文件的方法
2018/04/22 Python
Python中文编码知识点
2019/02/18 Python
python实现微信每日一句自动发送给喜欢的人
2019/04/29 Python
机关作风建设自查报告
2014/10/22 职场文书
人民的好儿女观后感
2015/06/18 职场文书
2015教师个人师德工作总结
2015/10/23 职场文书
Python答题卡识别并给出分数的实现代码
2021/06/22 Python
MySQL 四种连接和多表查询详解
2021/07/16 MySQL
Python实现Hash算法
2022/03/18 Python
SpringBoot中使用Redis作为全局锁示例过程
2022/03/24 Java/Android