【例】求如下二次规划问题。

【分析】首先应该把目标函数表示成如下矩阵形式:

这里要细说一下如何写成矩阵形式。

首先,向量x是很容易写出的,因为f(x)包含两个变量x1x2,因此

其次,向量f只与两个变量x1x2的一次项有关,所以fTx=-2x1-6x2,因此

最后,矩阵H只与两个变量x1x2的二次项有关,所以,这里要注意的是不同于二次型,这里有个系数1/2,所以矩阵H的元素是二次型中的矩阵元素大小的两倍。给出一个规律:设矩阵H第i行第j列的元素大小为H(i,j),二次项xixj的系数为a(i,j),则

本例中,,这是由于x1的平方项(即x1x1)系数为1/2,所以第1行第1列的元素为1=2*(1/2),x2的平方项(即x2x2)系数为1,所以第2行第2列的元素为2=2*1,x1x2项(即x2x1)的系数为-1,所以第1行第2列和第2行第1列的元素均为-1。

目标函数搞定之后,下面来看约束条件部分,约束条件应该写成如下形式:

本例中约束条件只有不等式约束,因此Aeq和beq为空,对于A和b很容易就可以得出来:

而约束条件中对变量x1x2只给出下限,没有给上限,因此ub为空,

得到了所有的参数,将参数输入MATLAB,编程如下:(代码是直接在Command Window中一行一行录入的,所以每行前面有符号“>>”)

>> H = [1 -1; -1 2];
>> f = [-2; -6];
>> A = [1 1; -1 2; 2 1];
>> b = [2; 2; 3];
>> lb = [0; 0];
>> [x,fval,exitflag,output,lambda] = quadprog(H,f,A,b,[],[],lb)

输出以下结果:

Warning: Large-scale algorithm does not currently solve this problem formulation,
using medium-scale algorithm instead.
> In quadprog at 291
Optimization terminated. x = 0.6667
1.3333 fval = -8.2222 exitflag = 1 output = iterations: 3
constrviolation: 0
algorithm: 'medium-scale: active-set'
firstorderopt: []
cgiterations: []
message: 'Optimization terminated.' lambda = lower: [2x1 double]
upper: [2x1 double]
eqlin: [0x1 double]
ineqlin: [3x1 double]

参考文献:

【1】孙文瑜, 徐成贤,朱德通.最优化方法(第二版)[M]. 北京:高等教育出版社, 2010.

【2】龚纯,王正林. 精通MATLAB最优化计算[M].北京: 电子工业出版社,2009.

【3】lnsunqingshen, 464518439.什么是凸二次规划, 百度知道,2011-06-20.

【4】李明强.几类特殊凸二次规划问题的求解算法研究[D].山东科技大学,2013 .

【5】于绍慧.边界约束凸二次规划的求解[D].南京航空航天大学,2005.

参考:https://blog.csdn.net/jbb0523/article/details/50598641

https://blog.csdn.net/tianzy16/article/details/87916128

MATLAB quadprog函数求解二次规划问题的更多相关文章

  1. matlab sign函数用法及实例

    在MATLAB科学计算过程当中,我们经常需要对我们的计算公式或者计算结果检验其符号,,sign函数就给我们提供了这种方便,下面就通过实例介绍一下matlab sign函数 的用法,希望能够给您带来帮助 ...

  2. matlab std函数 用法及实例

    MATLAB常常用到std函数来进行标准差计算,下面我就通过实例介绍一下 matlab std函数怎么用. 1. std函数是用来计算标准偏差的一个函数,由于其有不同的参数,我们就用下面的例子进行介绍 ...

  3. Matlab随笔之求解线性方程

    原文:Matlab随笔之求解线性方程 理论知识补充: %矩阵除分为矩阵右除和矩阵左除. %矩阵右除的运算符号为“/”,设A,B为两个矩阵,则“A/B”是指方程X*B=A的解矩阵X. %矩阵A和B的列数 ...

  4. C++和MATLAB混合编程求解多项式系数(矩阵相除)

    摘要:MATLAB对于矩阵处理是非常高效的,而C++对于矩阵操作是非常麻烦的,因而可以采用C++与MATLAB混合编程求解矩阵问题. 主要思路就是,在MATLAB中编写函数脚本并使用C++编译为dll ...

  5. KMP算法-next函数求解

    KMP函数求解:一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt同时发现,因此人们称它为KMP算法.KMP算法的关键是利用匹配失败后的信息,尽量减少模式串与主串 ...

  6. MyEclipse调用Matlab打包函数

    本文部分内容参考了http://www.360doc.com/content/15/1103/16/1180274_510463048.shtml 一.检查Java环境 对于已经装上JAVA环境的计算 ...

  7. Matlab中函数定义方法

    Matlab自定义函数的六种方法 n1.函数文件+调用函数(命令)文件:需单独定义一个自定义函数的M文件: n2.函数文件+子函数:定义一个具有多个自定义函数的M文件: n3.Inline:无需M文件 ...

  8. Matlab图像处理函数:regionprops

    本篇文章为转载,仅为方便学术讨论所用,不用于商业用途.由于时间较久,原作者以及原始链接暂时无法找到,如有侵权以及其他任何事宜欢迎跟我联系,如有侵扰,在此提前表示歉意.----------------- ...

  9. 向量和矩阵的范数及MATLAB调用函数

    范数就是长度的一种推广形式,数学语言叫一种度量.比如有一个平面向量,有两个分量来描述:横坐标和纵坐标.向量的二范数就是欧几里得意义下的这个向量的长度.还有一些诸如极大值范数,就是横坐标或者纵坐标的最大 ...

随机推荐

  1. 基于JQuery打造无缝滚动新闻

    JQuery实现 新闻无缝滚动 一.使用"首尾追加"实现无缝滚动 <head lang="en"> <meta charset="U ...

  2. 2W字长文吐血整理 Docker&云原生

    Docker 和 云原生 一.概念介绍 1.1 Docker Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Win ...

  3. linux基本篇--入门成神之路

    一.linux基础操作 1.初识bash shell概念  shell是系统的用户界面,提供了用户与内核进行交互操作的一种接口,他接受用户输入的命令并把它送入内核去执行,实际上shell是一个命令解释 ...

  4. JSP 表单提交 数据库乱码解决方法

    问题:有时候在做jsp逻辑处理时,比如提交表单,从前台注册的页面提交了一部分的数据,但是后面处理的JSP页面通过 request.getParameter 调用时,获取到的是一堆乱码. 乱码分析:因为 ...

  5. 《前端运维》一、Linux基础--05Shell运算符

    今天我们来学习下Shell运算符,Shell跟其他的编程语言一样,也支持多种运算符,包括: 算数运算符 关系运算符 布尔运算符 字符串运算符 文件测试运算符 那下面,我们就一一来学习一下这些运算符. ...

  6. MySQL CREATE TABLE 简单设计模板交流

      推荐用 MySQL 8.0 (2018/4/19 发布, 开发者说同比 5.7 快 2 倍) 或同类型以上版本. CREATE TABLE TEMPLATE CREATE TABLE [table ...

  7. 遇到REMOTE HOST IDENTIFICATION HAS CHANGED怎么办?

    今日遇到如下问题: 警告的大概意思就是,主机密钥发生变更,并提示安全风险(可能存在中间人攻击) 但是事实是,这是因为我重装系统之后遇到的问题.重装系统后,指纹当然会发生变化了...在Xshell实验中 ...

  8. maltego的基本使用

    首次使用maltego需要注册 注册网站:https://www.paterva.com/web7/buy/maltego-clients/maltego-ce.php 填写好点注册就行了 1. 打开 ...

  9. strcpy、strncpy 和安全的strncpy_s

    strcpy和strncpy摘于linux 内核源码的/lib/string.c char *self_strcpy(char *dest, const char *src) { char *tmp ...

  10. [MRCTF]XOR-无法生成反汇编的处理

    主程序,无法生成伪代码 由此分为两种方法即: 直接看反汇编 解决问题,尝试生成伪代码 硬啃汇编 输入与输出 判断输入长度是否为0x1B,其中al为eax的低8位 将输入的字符每个与当前字符所在下标异或 ...