matlab学习-线性规划

来源:互联网 发布:腾讯视频网络错误 编辑:程序博客网 时间:2024/05/22 15:22

[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&lt;=20
           3*x1+2*x2+4*x3&lt;=42
           3*x1+2*x2&lt;=30
           0&lt;=x1;0&lt;=x2;0&lt;=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的结果都一样。

 

原创粉丝点击