Matlab 线性规划 linprog

x = linprog( c , A , b , Aeq , beq , lb , ub , x0 )是求解线性规划问题的命令。
c是目标函数的系数向量,A是不等式约束AX<=b的系数矩阵,b是不等式约束AX<=b的常数项
Aeq是等式约束AeqX=beq的系数矩阵,beq是等式约束AeqX=beq的常数项,lb是X的下限,ub是X的上限,X是向量[x1,x2,…xn]即决策变量。
指定迭代的初始值x0;
如果模型中不包含不等式约束条件,可用[]代替A和b表示缺省;如果没有等式约束条件,可用[]代替Aeq和beq表示缺省;如果某个xi无下界或上界,可以设定lb(i)=-inf或ub(i)=inf;
用[x , Fval]代替上述各命令行中左边的x,则可得到在最优解x处的函数值Fval;


函数格式:linprog(f,a,b,a1,b1,xstart,xend)
f:求解最小函数的表达式系数矩阵是m*1的矩阵
a:≤不等式条件约束矩阵其均为形式
b:a对应不等式右边的常数项
a1:=等式条件约束矩阵
b1:a1对应不等式右边的常数项
xstart:x的取值范围的最小值的系数矩阵为n*1的矩阵
xend:x的取值范围的最大值的系数矩阵为n*1的矩阵

函数说明:不存在的项填写[]即可

函数功能:线性规划求最优值.

函数备注:此文章所写为Matlab里的函数,如果想查看线性规划底层源代码,可参看VB.NET编写的源代码线性规划求解_正则形法

例子1:
求f=3*x1+6*x2+2*x3的最大值
满足的条件是
3*x1+4*x2+x3≤2
x1+3*x2+2*x3≤1
且x1、x2、x3均大于等于0
Matlab求解如下
a =[ 3 4 1
1 3 2 ]
b =[ 2
1 ]
f=[ -3
-6
-2 ]%这里为什么会是负数,因为Matlab求的是f的最小值,要求最大值则取要求系数的相反数即可.
x=[ 0
0
0 ]
linprog(f,a,b,[],[],x,[])%执行的matlab命令后输出的如下内容.注意这里的[]表示那一项不存在.当然最后那一个[]也可以不要即linprog(f,a,b,[],[],x)
Optimization terminated.
ans =
0.4000
0.2000
0.0000%即x1=0.4,x2=0.2,x3=0为最优解.带回原式我可以知道f的最大值=3*0.4+6*0.2=2.4

例子2:
求f=-2*x1-3*x2-x3的最小值
满足的条件是
x1+x2+x3≤3
x1+4*x2+7*x3+x4=9
且x1、x2、x3、x4均大于等于0
Matlab求解如下
原题等价于求f=-2*x1-3*x2-x3+0*x4的最小值
其条件等价于
x1+x2+x3+0*x4≤3
x1+4*x2+7*x3+x4=9
则在Matlab输入如下内容
a=[1 1 1 0]
b=[3]
a1=[1 4 7 1]
b1=[9]
x=[ 0
0
0
0]
f=[ -2
-3
-1
0]
linprog(f,a,b,a1,b1,x)%执行命令或者输入linprog(f,a,b,a1,b1,x,[])
Optimization terminated.
ans =
1.0000
2.0000
0.0000
0.0000%说明x1=1,x2=2,x3=0,x4=0取得最小值

说明:任何线性规划问题都可以转化为上面的问题求解.细节问题请Google线性规划标准形式
1、当目标函数求最大值时,例如求f=a1*x1+a2*x2+……+an*xn的最大值时这个时候等价于求f=-a1*x1-a2*x2-……-an*xn的最小值
2、当约束条件为a1*x1+a2*x2+……+an*xn≥b这种形式的时候其约束等价于a1*x1+a2*x2+……+an*xn-xnn=b即多了一个xnn(xnn≥0)变量
3、当一个变量比如x1是无约束的变量时,其实等价于x1=x2-x3即把一个变量x1分解成2个变量x2与x3之差(x2、x3≥0)把是x1的地方替换为(x2-x3)即可