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的结果都一样。