matlab学习-线性规划
[x,fval,exitflag,output,lambda]=linprog(f,a,b,aeq,beq,lb,ub)
其中f、x、b、beq、lb、ub為向量,a、aeq為矩陣。
min z=f
s.t. a*x<=b
?????????? aeq*x=beq
?????????? lb<=x<=ub
x:線性規劃最優解
fval:線性規劃最優值
exitflag:輸出標志 1 成功 -1 失敗
output:算法和迭代情況
lambda: 存儲情況
函數 linprog
格式 x = linprog(f,A,b)???%求min f ' *x???sub.to??ax<=b線性規劃的最優解。
?????x = linprog(f,A,b,Aeq,beq)???%等式約束,若沒有不等式約束,則A=[ ],b=[ ]。
??????????? x = linprog(f,A,b,Aeq,beq,lb,ub)???%指定x的范圍,若沒有等式約束 ,則Aeq=[ ],beq=[ ]
??????????x = linprog(f,A,b,Aeq,beq,lb,ub,x0)???%設置初值x0
??????????x = linprog(f,A,b,Aeq,beq,lb,ub,x0,options)??? % options為指定的優化參數
?????[x,fval] = linprog(…)???% 返回目標函數最優值,即fval= f ' *x。
?????[x,lambda,exitflag] = linprog(…)???% lambda為解x的Lagrange乘子。
?????[x, lambda,fval,exitflag] = linprog(…)???% exitflag為終止迭代的錯誤條件。
?????[x,fval, lambda,exitflag,output] = linprog(…)???% output為關于優化的一些信息
說明 若exitflag>0表示函數收斂于解x,exitflag=0表示超過函數估值或迭代的最大數字,exitflag<0表示函數不收斂于解x;若lambda=lower 表示下界lb,lambda=upper表示上界ub,lambda=ineqlin表示不等式約束,lambda=eqlin表示等式約束,lambda中的非0元素表示對應的約束是有效約束;output=iterations表示迭代次數,output=algorithm表示使用的運算規則,output=cgiterations表示PCG迭代次數。
例1: 求下面的優化問題
min?????? -5*x1-4*x2-6*x3
sub.to???? x1-x2+x3<=20
?????????? 3*x1+2*x2+4*x3<=42
?????????? 3*x1+2*x2<=30
?????????? 0<=x1;0<=x2;0<=x3;
>>f = [-5; -4; -6];
>>A =??[1 -1??1;3??2??4;3??2??0];
>>b = [20; 42; 30];
>>lb = zeros(3,1);
>>[x,fval,exitflag,output,lambda] = linprog(f,A,b,[],[],lb)
結果為:
x =??????%最優解
????0.0000
???15.0000
????3.0000
fval =?????%最優值
??-78.0000
exitflag =?????%收斂
?????1
output =
??????iterations: 6???%迭代次數
????cgiterations: 0
???????algorithm: 'lipsol'???%所使用規則
lambda =
????ineqlin: [3x1 double]
??????eqlin: [0x1 double]
??????upper: [3x1 double]
??????lower: [3x1 double]
>> lambda.ineqlin
ans =
????0.0000
????1.5000
????0.5000
>> lambda.lower
ans =
????1.0000
????0.0000
????0.0000
表明:不等約束條件2和3以及第1個下界是有效的
例2:max z=x1+x2
S.T. -2x1+x2<=4;
?????????? x1-x2<=2
x1,x2>=0
f=[-1,-1]';
a=[-2 1:1 -1];
b=[4 2]
lb=zeros(2,1);
[x,fval,exitflag,output,lambda]=linprog(f,a,b,[],[],lb)
ck=ckab(q,w,p)
檢查不等式約束時q=a,w=b?????? ck>=0滿足 否則不滿足
檢查等式約束時?????? q=aeq,w=beq?????? ck=0滿足 否則不滿足
funv1(f,p)
f為多元線性齊次函數,它以列矩陣形式表示;
p表示相應的自變量的值,仍以列矩陣形式表示
在輸出部分,為多元線性齊次方程f在p點的值
funv2(f,p)
f為多元線性齊次函數,它以字符串表示;
p表示相應的自變量的值,仍以列矩陣形式表示
在輸出部分,為多元線性齊次方程f在p點的值
例3:
min z= -x(2)+2x(3)
s.t.x(1)-2x(2)+x(3)=2
x(2)-3x(3)+x(4)=1
x(2)-x(3) +x(5)=2
x(j)>=0 j=1,...5
x(4)和x(5)是不是松弛變量啊?不是的話,就是以下程序。
clear;clc
fmin=[0;-1;2;0;0]; %min z= -x(2)+2x(3)
Aeq=[1 -2 1 0 0 %s.t.x(1)-2x(2)+x(3)=2
0 1 -3 1 0 %x(2)-3x(3)+x(4)=1
0 1 -1 0 1] %x(2)-x(3) +x(5)=2 ;
beq=[2;1;2];
st=[0 0 0 0 0];
b=[0];
lb=zeros(5,1);
[x,fval,exitflag,output,lambda]=linprog(fmin,st,b,Aeq,beq,lb)
運行結果:
x =
6.5000
2.5000
0.5000
0.0000
0.0000
fval =
-1.5000
如果是松弛變量,則程序為:
clear;clc
fmin=[0;-1;2]; %min z= -x(2)+2x(3)
Aeq=[1 -2 1]%s.t.x(1)-2x(2)+x(3)=2
st=[0 1 -3 %x(2)-3x(3)+x(4)=1
0 1 -1] %x(2)-x(3) +x(5)=2 ;
beq=[2];
b=[1;2];
lb=zeros(3,1);
[x,fval,exitflag,output,lambda]=linprog(fmin,st,b,Aeq,beq,lb)
運行結果:
x =
6.5000
2.5000
0.5000
fval =
-1.5000
可以看出,無論是否加松弛變量x(4)和x(5),Matlab的結果都一樣。
?
總結
以上是生活随笔為你收集整理的matlab学习-线性规划的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 川流不息
- 下一篇: 搜索时,怎样排除不需要的关键字