MATLAB規(guī)劃問(wèn)題——線性規(guī)劃和非線性規(guī)劃
1.線性規(guī)劃
求線性規(guī)劃問(wèn)題的最優(yōu)解有兩種方法,一種方法是使用linprog命令,另一種是使用optimtool工具箱,下面分別介紹這兩種方法.
①linprog命令
一般情況下,Linprog命令的參數(shù)形式為[x,fval] = linprog(f,A,b,Aeq,beq,lb,ub,x0),下面分別介紹各參數(shù)的含義.
[x,fval]返回值中x為最優(yōu)解,fval為最優(yōu)值.
f表示目標(biāo)函數(shù)中各個(gè)變量前面的系數(shù)向量,如果是求最小值問(wèn)題,那么f就是各個(gè)變量的系數(shù),如果是求最大值問(wèn)題,那么f就是各個(gè)變量的系數(shù)的相反數(shù).
A和b 表示不等式約束A*x <=b中的矩陣A和向量b.
Aeq和beq 表示等式約束Aeq*x =beq中的矩陣Aeq和向量beq.
lb和ub 分別表示自變量的上下界組成的向量,如果沒(méi)有上下界,該選項(xiàng)用[]表示,如果只有部分變量有上下界,其余的變量沒(méi)有,那么可以把沒(méi)有上下界的變量的上下界設(shè)為-inf或者inf使lb或者ub的長(zhǎng)度符合要求.
x0 表示變量的初始值,可以缺省.
例,求如下的線性規(guī)劃問(wèn)題
由目標(biāo)函數(shù)可知f=[-5;-4;-6];
由約束條件可知矩陣A = [1 -11;3 2 4;3 2 0];右端向量為b = [20;42;30];
由自變量都大于零可知lb =[0;0;0];
所以求該線性規(guī)劃問(wèn)題最優(yōu)解的代碼如下
f = [-5;-4;-6];
A = [1 -1 1;3 24;3 2 0];
b = [20;42;30];
lb = [0;0;0];
[x,fval] =linprog(f,A,b,[],[],lb)
其中Aeq和beq都為空,因?yàn)闆](méi)有等式約束條件,只有不等式約束條件.
②optimtool工具箱
在Command窗口輸入optimtool,即可彈出optimtool工具箱,如下
工具箱可以大致分為5個(gè)部分.第5部分為說(shuō)明文檔,第4部分為優(yōu)化選項(xiàng),第3部分為最優(yōu)解和最優(yōu)值的顯示區(qū)域,第2部分為約束條件輸入?yún)^(qū),第1部分可以填入目標(biāo)函數(shù)值,初始值等.
利用工具箱求解①的問(wèn)題,填入相應(yīng)的數(shù)據(jù),然后點(diǎn)擊【start】按鈕,得到結(jié)果如下
可以看到,最優(yōu)解與linprog命令的方式求得的結(jié)果是相同的,但最優(yōu)值不是-78,因?yàn)檫@是迭代的結(jié)果,只有在迭代次數(shù)區(qū)域無(wú)窮的時(shí)候,才能得到準(zhǔn)確值-78.
再舉一例,利用MATLAB求解下面這個(gè)線性規(guī)劃問(wèn)題
這是求最大值問(wèn)題,要先將問(wèn)題化為求解最小值的問(wèn)題,再進(jìn)行求解.
利用linprog命令求解上述問(wèn)題的代碼如下
f = [-2;-3;5];
A = [-2 5 -1];b= [-10];
Aeq = [1 11];beq = [7];
lb = [0;0;0];
[x,feval] = linprog(f,A,b,Aeq,beq,lb)
利用optimtool工具箱來(lái)求解過(guò)程如下圖
可以驗(yàn)證,兩種求解方法的結(jié)果是相同的.最后取最優(yōu)值為圖中顯示的最優(yōu)值的相反數(shù).
—————分割線——————
2.非線性規(guī)劃
也有兩種求解的方法,一種是fmincon命令,另一種是optimtool工具箱.
①fmincon命令
fmincon命令的一般參數(shù)形式為fmincon(‘fun’,x0,A,b,Aeq,beq,lb,ub,’nonlinearcondition’),其中各個(gè)參數(shù)含義如下
fun 目標(biāo)函數(shù)(以求最小值為目標(biāo)函數(shù))
x0 最優(yōu)解迭代的初始值
A,b 線性約束不等式A*x<= b
Aeq,beq 線性約束等式Aeq*x =beq
lb,ub 自變量的上下界
nonlinearcondition 非線性約束函數(shù),它有兩個(gè)返回值,其中一個(gè)為非線性不等式約
束,另一個(gè)是非線性等式約束(具體舉例說(shuō)明該項(xiàng)參數(shù)的設(shè)置)
在具體編寫(xiě)代碼過(guò)程中,可以將線性約束也寫(xiě)在非線性約束函數(shù)nonlinearcondition中,簡(jiǎn)化代碼.
例1,求下面這個(gè)非線性規(guī)劃問(wèn)題的最優(yōu)值
首先,編寫(xiě)目標(biāo)函數(shù)的M函數(shù)文件,并保存為fun.m代碼如下
function f =fun(x)
f = x(1)^2 + x(2)^2 + 8;
end
其次,編寫(xiě)線性和非線性約束的等式或不等式,編寫(xiě)M函數(shù)文件,并保存為nonlinearcondition.m,代碼如下
function [f,ceq] = nonlinearcondition(x)
f = - x(1)^2 + x(2);
ceq = - x(1) - x(2)^2 + 2; %非線性等式約束
end
最后,在Command窗口輸入如下代碼
[x,fval] =fmincon('fun',[0;0],[],[],[],[],[0;0],[],'nonlinearcondition')
即可得到最優(yōu)值和最優(yōu)解為x = [1;1],fval = 10.
例2,求下面這個(gè)非線性規(guī)劃問(wèn)題的最優(yōu)值
首先,編寫(xiě)目標(biāo)函數(shù)的M函數(shù)文件,由于求得是最大值,所以先化為求最小值問(wèn)題,再原目標(biāo)函數(shù)前面添加負(fù)號(hào)即可,M函數(shù)文件如下,保存為fun.m.
function f =fun(x)
f = -(sqrt(x(1)) + sqrt(x(2)) + sqrt(x(3)) +sqrt(x(4)));
end
然后,編寫(xiě)線性和非線性約束不等式已經(jīng)非線性約束等式的M函數(shù)文件,保存為nonlinearcondition.m,代碼如下
function [f,ceq]= nonlinearcondition(x)
%非線性和線性不等式有4個(gè)
f(1) =x(1) - 400;
f(2) =1.1*x(1) + x(2) - 440;
f(3) =1.21*x(1) + 1.1*x(2) + x(3) - 484;
f(4) =1.331*x(1) + 1.21*x(2) + 1.1*x(3) + x(4) - 532.4;
ceq = 0;%由于沒(méi)有非線性約束等式,所以這一項(xiàng)寫(xiě) 0
end
最后,在Command窗口輸入如下代碼
[x,fval] =fmincon('fun',[0;0;0;0],[],[],[],[],[0;0;0;0],[],'nonlinearcondition')
即可得到最優(yōu)解和最優(yōu)值,最優(yōu)值分別為
x =
86.1883
104.2879
126.1883
152.6879
fval = -43.0860
目標(biāo)函數(shù)最優(yōu)值為z = -fval=43.0860.
由于線性問(wèn)題也可以看做是非線性問(wèn)題的特殊情況,所以可用求解非線性問(wèn)題的方法求解線性規(guī)劃問(wèn)題.
例3,利用fmincon命令求解1.①中的線性規(guī)劃問(wèn)題
首先,編寫(xiě)目標(biāo)函數(shù)的M函數(shù)文件,M函數(shù)文件如下,保存為fun.m.
function f =fun(x)
f = -5*x(1) - 4*x(2) - 6*x(3);
end
然后,編寫(xiě)線性和非線性約束不等式已經(jīng)非線性約束等式的M函數(shù)文件,保存為nonlinearcondition.m,代碼如下
function [f,ceq]= nonlinearcondition(x)
%由于有3個(gè)線性約束,所以f返回一個(gè)三維向量
f(1) =x(1) - x(2) + x(3) - 20;
f(2) =3*x(1) + 2*x(2) + 4*x(3) - 42;
f(3) =3*x(1) + 2*x(2) - 30;
ceq = 0;%沒(méi)有非線性等式
end
最后,在Command窗口輸入如下代碼
[x,fval] =fmincon('fun',[0;0;0],[],[],[],[],[0;0;0],[],'nonlinearcondition')
得到的結(jié)果與1.線性規(guī)劃問(wèn)題的1.①中所用的線性方法所得結(jié)果相同.
②optimtool工具箱
同樣,非線性規(guī)劃也可以利用optimtool工具箱,因?yàn)槠渲杏幸豁?xiàng)是填寫(xiě)非線性約束條件的,如下
利用工具箱求解在2.①中的一個(gè)問(wèn)題
首先,編寫(xiě)目標(biāo)函數(shù)的M函數(shù)文件,由于求得是最大值,所以先化為求最小值問(wèn)題,再原目標(biāo)函數(shù)前面添加負(fù)號(hào)即可,M函數(shù)文件如下,保存為fun.m.
function f =fun(x)
f = -(sqrt(x(1)) + sqrt(x(2)) + sqrt(x(3)) +sqrt(x(4)));
end
然后,編寫(xiě)線性和非線性約束不等式已經(jīng)非線性約束等式的M函數(shù)文件,保存為nonlinearcondition.m,代碼如下
function [f,ceq]= nonlinearcondition(x)
%非線性和線性不等式有4個(gè)
f(1) =x(1) - 400;
f(2) =1.1*x(1) + x(2) - 440;
f(3) =1.21*x(1) + 1.1*x(2) + x(3) - 484;
f(4) =1.331*x(1) + 1.21*x(2) + 1.1*x(3) + x(4) - 532.4;
ceq = 0;%由于沒(méi)有非線性約束等式,所以這一項(xiàng)寫(xiě) 0
end
在optimtool工具箱中輸入相應(yīng)參數(shù),如下,即可得到相應(yīng)結(jié)果
所得結(jié)果與利用fmincon命令所得結(jié)果相同.
小結(jié)
規(guī)劃問(wèn)題中還有特殊的一些問(wèn)題,例如特殊的線性規(guī)劃問(wèn)題——0-1規(guī)劃,特殊的非線性規(guī)問(wèn)題——二次規(guī)劃問(wèn)題,而線性規(guī)劃問(wèn)題又是特殊的非線性規(guī)劃問(wèn)題,所以這幾種規(guī)劃問(wèn)題都可以用【非線性規(guī)劃問(wèn)題】求解.
參考文獻(xiàn)
[1] 卓金武, 魏永生, 秦健, 李必文. MATLAB在數(shù)學(xué)建模中的應(yīng)用[M]. 北京: 北京航空航天大學(xué) 2011: 18-24 .
來(lái)源:CSDN博客
工程師必備
- 項(xiàng)目客服
- 培訓(xùn)客服
- 平臺(tái)客服
TOP




















