MATLAB编程与应用系列-第11章 Matlab在工程优化中的应用(5)

本系列教程来源于出版书籍《基于MATLAB编程基础与典型应用书籍》,如涉及版权问题,请联系:156204968@qq.com。 出版社:人民邮电出版社, 页数:525。

本系列教程目前基于MATLABR2006a,可能对于更高级版本的功能和函数有差异,教程中如有问题,请联系:156204968@qq.com

11.2.4 二次规划问题

二次规划问题在Matlab优化工具箱中可以表示为:

\begin{array}{cl} {\rm{min}_x}&1/2x^{T}\bf{H}x+f^{T}x\\ {\rm{s.t}}&\bf{A}.\mit x \leq b\\ {}&{\bf{A_{\rm{eq}}}}.x=b_{\rm{eq}}\\ {}&{\rm{lb}\leq x \leq \rm{ub}}\\ \end{array}

标准的二次规划问题形式要求目标函数是关于优化变量的二次函数,而约束条件只包含线性等式不等式约束和优化变量自身的上下限约束。对于二次规划问题,如果将目标函数看着非线性函数,那么二次规划问题则可以使用fmincon函数来进行求解。在Matlab优化工具箱中,提供了quadprog函数,求解具有标准二次规划形式的问题。quadprog函数的调用格式如下:

x = quadprog(H,f,A,b) 
x = quadprog(H,f,A,b,Aeq,beq) 
x = quadprog(H,f,A,b,Aeq,beq,lb,ub) 
x = quadprog(H,f,A,b,Aeq,beq,lb,ub,x0) 
x = quadprog(H,f,A,b,Aeq,beq,lb,ub,x0,options) 
[x,fval] = quadprog(...) 
[x,fval,exitflag] = quadprog(...) 
[x,fval,exitflag,output] = quadprog(...) 
[x,fval,exitflag,output,lambda] = quadprog(...)

quadprog函数输入变量中,H和f分别为二次项系数矩阵和一次项系数向量。在对二次规划问题求解时,首先需要将目标函数转化为二次规划问题标准形式,得到系数矩阵H和系数向量f。quadprog函数退出标志exitflag及相应含义描述如表11.8所示。
表11.8 quadprog函数退出标志exitflag及相应含义描述

exitflag标志 含义描述
1 目标函数收敛于最优解
3 目标函数的变化小于给定的容差TolFcn
4 找到局部极小值点
0 迭代次数超过最大迭代次数MaxIter
-2 求解问题无可行解
-3 求解问题无边界
-4 当前搜索方向不是下降方向,搜索过程结束
-7 搜索方向幅值太小,搜索过程结束

【例11.8】求解二次规划问题:

\begin{array}{cl} {\rm{min}}&z=x_1^2-10x_1-x_1x_2+x+x_2^2-4x_2\\ {\rm{s.t}}&x_1+x_2-8 \geq 0\\ {}&{x_1 \geq 0,x_2 \geq 0}\\ \end{array}

对于二次规划问题,首先必须将目标函数转化为标准形式,得到二次项系数矩阵\bf{H}和一次项系数向量\bf{f}

\bf{H}=\begin{bmatrix} 2&-1\\ -1&2\\ \end{bmatrix},\bf{f}=\begin{bmatrix}-10\\4\end{bmatrix}

然后在Matlab命令窗口中输入以下程序段:

H=[2 -1;-1 2];      %标准变换后的H矩阵
f=[-10;4];          %标准变换后的f向量
lb=zeros(2,1);      %下限约束
A=[-1 -1];      %线性不等式系数矩阵
b=-8;           %线性不等式右侧常数向量
[x,fval,exitflag,output,lambda] = quadprog(H,f,A,b,[ ],[ ],lb)      %二次规划求解

返回结果如下:

x =
    6.3333
    1.6667
fval =
  -24.3333
exitflag =
     1

退出标志exitflag表明函数收敛与极值点。同样,将目标函数看着是非线性函数时,可以使用fmincon函数对二次规划问题进行求解,程序代码如下:

A=[-1 -1];
b=[-8];
lb=[0 0];
x0=[0;0];
fun=@(x)(x(1)^2-10*x(1)-x(1)*x(2)+x(2)^2-4*x(2));       %@函数句柄
options=optimset('Display','iter','MaxFunEvals',1e5);
[x,fval,exitflag,output,lambda,grad,hessian]=fmincon(fun,x0,A,b,[],[],lb,[],[],options)

返回结果,显示的迭代过程如下:

                                    max     Line search  Directional      First-order 
 Iter   F-count        f(x)         constraint   steplength   derivative   optimality Procedure 
    0      3            0          8                                         Infeasible 
    1      6          -40         -4            1        36            6      start point
    2     10     -50.7721         -6.9          0.5        0.864        1.57   
    3     13     -51.9816       -5.743            1        0.337        0.204   
    4     16          -52           -6            1    4.26e-008    4.45e-006   

经过4代迭代后,方向导数为4.26e-8,因此搜索方向导数过小导致搜索过程结束,退出标志exitflag=5。输出结果如下:

x =
    8.0000
    6.0000
fval =
  -52.0000
exitflag =
     5

由于fmincon函数退出标志exitflag=5,因此无法判断此求解结果是否为全局极值点,但是比较fmincon函数和quadprog函数二者求解结果可以看出,fmincon函数的求解结果比quadprog函数要好。

【例11.9】求解二次规划问题

\begin{array}{cl} {\rm{min}}&z=x_1^2-10x_1-x_1x_2+x+x_2^2-4x_2\\ {\rm{s.t}}&x_1+x_2-8 \geq 0\\ {}&{x_1 \geq 0,x_2 \geq 0}\\ \end{array}

该二次规划问题中,约束条件同时包含了线性等式约束和线性不等式约束。首先同样需要将目标函数转化为标准形式,得到系数矩阵和向量,通过变换,很容易得到:

\bf{H}=\begin{bmatrix} 4&-1&0\\ -1&2&0\\ 0&0&2 \end{bmatrix},\bf{f}=\begin{bmatrix}0\\0\\0\end{bmatrix}

使用quadprog函数求解二次规划问题程序代码如下:

H=[4 -1 0;-1 2 0;0 0 2];        %二次规划标准变换后的H矩阵
f=zeros(3,1);               %二次规划标准变换后的f矩阵
lb=zeros(3,1);              %优化变量的下限约束
A=[1 1 0];              %线性不等式的系数矩阵
b=4;                    %线性不等式右侧常数向量
Aeq=[5 0 1];            %等式约束的系数矩阵
beq=[10];               %等式约束右侧常数向量
[x,fval,exitflag,output,lambda] = quadprog(H,f,A,b,Aeq,beq,lb)

返回结果为:

x =
    1.8692
    0.9346
    0.6542
fval =
    6.5421
exitflag =
     1

使用fmincon函数同样可以对二次规划问题进行求解,只需要在命令行窗口中输入以下程序段即可:

A=[1 1 0];
b=4;
Aeq=[5 0 1];
beq=[10];
lb=zeros(3,1);
x0=[1;1;1];
fun=@(x)(2*x(1)^2-x(1)*x(2)+x(2)^2+x(3)^2);     %@函数
options=optimset('Display','iter','MaxFunEvals',1e5);   %优化过程属性选项的设置
[x,fval,exitflag,output,lambda,grad,hessian]=fmincon(fun,x0,A,b,Aeq,beq,lb,[],[],options)

返回结果为:

x =
    1.8691
    0.9347
    0.6543
fval =
    6.5421
exitflag =
     5

对比quadprog函数求解结果和fmincon函数的求解结果,可以看出对于例11.9所示的二次规划问题,两个函数的求解结果完全相同。

作者:德特数据
联系方式:156204968@qq.com

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,753评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,668评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,090评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,010评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,054评论 6 395
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,806评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,484评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,380评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,873评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,021评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,158评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,838评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,499评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,044评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,159评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,449评论 3 374
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,136评论 2 356

推荐阅读更多精彩内容