MATLAB規划問題——線性規划和非線性規划(from CSDN echo_hello)


1.線性規划

求線性規划問題的最優解有兩種方法,一種方法是使用linprog命令,另一種是使用optimtool工具箱,下面分別介紹這兩種方法.

①linprog命令

一般情況下,Linprog命令的參數形式為[x,fval] = linprog(f,A,b,Aeq,beq,lb,ub,x0),下面分別介紹各參數的含義.

[x,fval]返回值中x為最優解,fval為最優值.

f表示目標函數中各個變量前面的系數向量,如果是求最小值問題,那么f就是各個變量的系數,如果是求最大值問題,那么f就是各個變量的系數的相反數.

A和b    表示不等式約束A*x <=b中的矩陣A和向量b.

Aeq和beq    表示等式約束Aeq*x =beq中的矩陣Aeq和向量beq.

lb和ub    分別表示自變量的上下界組成的向量,如果沒有上下界,該選項用[]表示,如果只有部分變量有上下界,其余的變量沒有,那么可以把沒有上下界的變量的上下界設為-inf或者inf使lb或者ub的長度符合要求.

x0    表示變量的初始值,可以缺省.

例,求如下的線性規划問題

 

 

由目標函數可知f=[-5;-4;-6];

由約束條件可知矩陣A = [1 -11;3 2 4;3 2 0];右端向量為b = [20;42;30];

由自變量都大於零可知lb =[0;0;0];

所以求該線性規划問題最優解的代碼如下

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都為空,因為沒有等式約束條件,只有不等式約束條件.

②optimtool工具箱

在Command窗口輸入optimtool,即可彈出optimtool工具箱,如下

 

工具箱可以大致分為5個部分.第5部分為說明文檔,第4部分為優化選項,第3部分為最優解和最優值的顯示區域,第2部分為約束條件輸入區,第1部分可以填入目標函數值,初始值等.

利用工具箱求解①的問題,填入相應的數據,然后點擊【start】按鈕,得到結果如下

 

可以看到,最優解與linprog命令的方式求得的結果是相同的,但最優值不是-78,因為這是迭代的結果,只有在迭代次數區域無窮的時候,才能得到准確值-78.

再舉一例,利用MATLAB求解下面這個線性規划問題

 

 

這是求最大值問題,要先將問題化為求解最小值的問題,再進行求解.

利用linprog命令求解上述問題的代碼如下

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工具箱來求解過程如下圖

可以驗證,兩種求解方法的結果是相同的.最后取最優值為圖中顯示的最優值的相反數.

——————————————————————分割線——————————————————————

 

2.非線性規划

也有兩種求解的方法,一種是fmincon命令,另一種是optimtool工具箱.

①fmincon命令

fmincon命令的一般參數形式為fmincon(‘fun’,x0,A,b,Aeq,beq,lb,ub,’nonlinearcondition’),其中各個參數含義如下

fun    目標函數(以求最小值為目標函數)

x0     最優解迭代的初始值

A,b    線性約束不等式A*x<= b

Aeq,beq    線性約束等式Aeq*x =beq

lb,ub   自變量的上下界

nonlinearcondition   非線性約束函數,它有兩個返回值,其中一個為非線性不等式約

束,另一個是非線性等式約束(具體舉例說明該項參數的設置)

在具體編寫代碼過程中,可以將線性約束也寫在非線性約束函數nonlinearcondition中,簡化代碼.

例1,求下面這個非線性規划問題的最優值

 

 

 

首先,編寫目標函數的M函數文件,並保存為fun.m代碼如下

function f =fun(x)

f = x(1)^2 + x(2)^2 + 8;

end

其次,編寫線性和非線性約束的等式或不等式,編寫M函數文件,並保存為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')

即可得到最優值和最優解為x = [1;1],fval = 10.

例2,求下面這個非線性規划問題的最優值

 

首先,編寫目標函數的M函數文件,由於求得是最大值,所以先化為求最小值問題,再原目標函數前面添加負號即可,M函數文件如下,保存為fun.m.

function f =fun(x)

f = -(sqrt(x(1)) + sqrt(x(2)) + sqrt(x(3)) +sqrt(x(4)));

end

然后,編寫線性和非線性約束不等式已經非線性約束等式的M函數文件,保存為nonlinearcondition.m,代碼如下

function [f,ceq]= nonlinearcondition(x)

%非線性和線性不等式有4個

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;%由於沒有非線性約束等式,所以這一項寫 0

end

最后,在Command窗口輸入如下代碼

[x,fval] =fmincon('fun',[0;0;0;0],[],[],[],[],[0;0;0;0],[],'nonlinearcondition')

即可得到最優解和最優值,最優值分別為

x =

   86.1883

  104.2879

  126.1883

  152.6879

fval = -43.0860

         目標函數最優值為z = -fval=43.0860.

由於線性問題也可以看做是非線性問題的特殊情況,所以可用求解非線性問題的方法求解線性規划問題.

例3,利用fmincon命令求解1.①中的線性規划問題

 

首先,編寫目標函數的M函數文件,M函數文件如下,保存為fun.m.

function f =fun(x)

f = -5*x(1) - 4*x(2) - 6*x(3);

end

然后,編寫線性和非線性約束不等式已經非線性約束等式的M函數文件,保存為nonlinearcondition.m,代碼如下

function [f,ceq]= nonlinearcondition(x)

%由於有3個線性約束,所以f返回一個三維向量

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;%沒有非線性等式

end

最后,在Command窗口輸入如下代碼

[x,fval] =fmincon('fun',[0;0;0],[],[],[],[],[0;0;0],[],'nonlinearcondition')

得到的結果與1.線性規划問題的1.①中所用的線性方法所得結果相同.

②optimtool工具箱

同樣,非線性規划也可以利用optimtool工具箱,因為其中有一項是填寫非線性約束條件的,如下

利用工具箱求解在2.①中的一個問題

 

首先,編寫目標函數的M函數文件,由於求得是最大值,所以先化為求最小值問題,再原目標函數前面添加負號即可,M函數文件如下,保存為fun.m.

function f =fun(x)

f = -(sqrt(x(1)) + sqrt(x(2)) + sqrt(x(3)) +sqrt(x(4)));

end

然后,編寫線性和非線性約束不等式已經非線性約束等式的M函數文件,保存為nonlinearcondition.m,代碼如下

function [f,ceq]= nonlinearcondition(x)

%非線性和線性不等式有4個

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;%由於沒有非線性約束等式,所以這一項寫 0

end

在optimtool工具箱中輸入相應參數,如下,即可得到相應結果

所得結果與利用fmincon命令所得結果相同.

 

小結

規划問題中還有特殊的一些問題,例如特殊的線性規划問題——0-1規划,特殊的非線性規問題——二次規划問題,而線性規划問題又是特殊的非線性規划問題,所以這幾種規划問題都可以用【非線性規划問題】求解.

 

參考文獻

[1] 卓金武, 魏永生, 秦健, 李必文. MATLAB在數學建模中的應用[M]. 北京: 北京航空航天大學 2011: 18-24


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM