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)題

MATLAB規(guī)劃問(wèn)題——線性規(guī)劃和非線性規(guī)劃的圖1



由目標(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工具箱,如下

MATLAB規(guī)劃問(wèn)題——線性規(guī)劃和非線性規(guī)劃的圖2

工具箱可以大致分為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é)果如下

MATLAB規(guī)劃問(wèn)題——線性規(guī)劃和非線性規(guī)劃的圖3

可以看到,最優(yōu)解與linprog命令的方式求得的結(jié)果是相同的,但最優(yōu)值不是-78,因?yàn)檫@是迭代的結(jié)果,只有在迭代次數(shù)區(qū)域無(wú)窮的時(shí)候,才能得到準(zhǔn)確值-78.

再舉一例,利用MATLAB求解下面這個(gè)線性規(guī)劃問(wèn)題

MATLAB規(guī)劃問(wèn)題——線性規(guī)劃和非線性規(guī)劃的圖4

這是求最大值問(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ò)程如下圖

MATLAB規(guī)劃問(wèn)題——線性規(guī)劃和非線性規(guī)劃的圖5

可以驗(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)值

MATLAB規(guī)劃問(wèn)題——線性規(guī)劃和非線性規(guī)劃的圖6

首先,編寫(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)值

MATLAB規(guī)劃問(wèn)題——線性規(guī)劃和非線性規(guī)劃的圖7

首先,編寫(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)題

MATLAB規(guī)劃問(wèn)題——線性規(guī)劃和非線性規(guī)劃的圖8

首先,編寫(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ě)非線性約束條件的,如下

MATLAB規(guī)劃問(wèn)題——線性規(guī)劃和非線性規(guī)劃的圖9

利用工具箱求解在2.①中的一個(gè)問(wèn)題

MATLAB規(guī)劃問(wèn)題——線性規(guī)劃和非線性規(guī)劃的圖10

首先,編寫(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é)果

MATLAB規(guī)劃問(wèn)題——線性規(guī)劃和非線性規(guī)劃的圖11

所得結(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博客


登錄后免費(fèi)查看全文
立即登錄
App下載
技術(shù)鄰APP
工程師必備
  • 項(xiàng)目客服
  • 培訓(xùn)客服
  • 平臺(tái)客服

TOP

3