1. 程式人生 > 實用技巧 >3. 用MATLAB優化工具箱解線性規劃和非線性規劃

3. 用MATLAB優化工具箱解線性規劃和非線性規劃

線性規劃

題目:

linprog找目標函式在約束條件下的最小值。

放題

第0問

假設生產甲飲料x百箱,乙飲料y百箱,利潤為z

上程式碼

c=[-10 -9];%因為linprog找的是最小值,所以這個地方取相反數。
% <=條件約束
A=[6 5; 10 20];
b=[60; 150];
%  =條件約束
Aeq=[];
beq=[];
%變數範圍約束
vlb=[0,0];
vub=[];
[x,fval]=linprog(c,A,b,Aeq,beq,vlb,vub); 

執行結果

當X =642 Y = 428 時候大概取最優值(是不是X應該多一個或者Y少一個,我懶得算了,正式比賽再說)

此時利潤 Z = 102.72

非線性規劃也很簡單

1.首先建立M檔案fun.m,定義目標函式F(x):

function f= =fun (X) ;

f= =F(X) ;

2. 若約束條件中有非線性約束:G(X)Ceq(X)=0,則建立M檔案nonlcon.m定義函式G(X)Ceq(X):

function [G,Ceq]=nonlcon(X)

G=...

Ceq=...

3.建立主程式.非線性規劃求解的函式是fmincon,命令的基本格式如下:

(1)x=fmincon( 'fun' ,Xo,A,b)

(2) x=fmincon( 'fun' ,Xo,A,b, Aeq, beq)

(3) x=fmincon( 'fun' ,Xo,A,b, Aeq, beq, VLB, VUB)

(4) x=fmincon( 'fun' ,Xo,A,b, Aeq, beq, VLB, VUB, ' nonlcon' )

(5)x-fmincon( 'fun' ,Xo,A,b, Aeq, beq, VLB, VUB, 'nonlcon' ,options)

(6) [x, fval]= fmincon(...)

(7) [x, fval,exitflag]= fmincon(...)

    function f=fun3(x);
    f=-x(1)-2*x(2)+(1/2)*x(1)^2+(1/2)*x(2)^2

  

(8) [x, fval, exi tflag, output]= fmincon(.. .)

非線性案例

案例1

程式碼:

fun.m

function f=fun(x);
f=-x(1)-2*x(2)+(1/2)*x(1)^2+(1/2)*x(2)^2

main.m

x0=[1;1];
A=[2 3 ;1 4]; b=[6;5];
Aeq=[];beq=[];
VLB=[0;0]; VUB=[];
[x,fval]=fmincon('fun',x0,A,b,Aeq,beq,VLB,VUB)

結果

x =

0.7647

1.0588

fval =

-2.0294

案例二

fun.m

function f=fun(x);
f=-2*x(1)-x(2);

mycon.m

function [g,ceq]=mycon(x)
g=[x(1)^2+x(2)^2-25;x(1)^2-x(2)^2-7];
ceq = [];

main.m

x0=[3;2.5];
A=[];b=[];
Aeq=[];beq=[];
vlb=[0 0];vub=[5 10];
[x,fval]=fmincon('fun',x0,A,b,Aeq,beq,vlb,vub,'mycon')

解得結果是

x =

4.0000

3.0000

fval =

-11.0000

標準型為:   min F(X)

s.t AX<=b G(X)

Ceq(X)=0 VLBXVUB