实验四 用MATLAB求解线性规划问题
一、实验目的:
了解Matlab的优化工具箱,能利用Matlab求解线性规划问题。
二、实验内容:
线性规划的数学模型有各种不同的形式,其一般形式可以写为: 目标函数:
minz?f1x1?f2x2???fnxn
a11x1?a12x2???a1nxn?b1???ax?as2x2???asnxn?bs
约束条件: s11c11x1?c12x2???c1nxn?d1???cx?ct2x2???ctnxn?ds
t11 这里量,
x1,x2,?,xn?0
称为目标函数,
z?f1x1?f2x2???fnxnaijfj称为价值系数,
f?(f1,f2,?,fn)T称为价值向
xj为求解的变量,由系数组成的矩阵
?a11?a1n??A?????????am1?amn??
称为不等式约束矩阵,由系数
cij组成的矩阵
?c11?c1n??C?????????cs1?csn??
称为等式约束矩阵,列向量非负约束。一个向量
b?(b1,b2,?,bn)T和
d?(d1,d2,?,dn)T为右端向量,条件
xj?0称为
x?(x1,x2,?,xn)T,满足约束条件,称为可行解或可行点,所有可行点的集合称为
可行区域,达到目标函数值最大的可行解称为该线性规划的最优解,相应的目标函数值称为最优目标函数
值,简称最优值。
我们这里介绍利用Matlab来求解线性规划问题的求解。
在Matlab中有一个专门的函数linprog()来解决这类问题,我们知道,极值有最大和最小两种,但求z的极大就是求?z的极小,因此在Matlab中以求极小为标准形式,函数linprog()的具体格式如下:
X=linprog(f,A,b)
[X,fval,exitflag,ouyput,lamnda]=linprog(f,A,b,Aeq,Beq,LB,UB,X0,options)
这里X是问题的解向量,f是由目标函数的系数构成的向量,A是一个矩阵,b是一个向量,A,b和变量x={x1,x2,…,xn}一起,表示了线性规划中不等式约束条件,A,b是系数矩阵和右端向量。Aeq和Beq表示了线性规划中等式约束条件中的系数矩阵和右端向量。LB和UB是约束变量的下界和上界向量,X0是给定的变量的初始值,options为控制规划过程的参数系列。返回值中fval是优化结束后得到的目标函数值。exitflag=0表示优化结果已经超过了函数的估计值或者已声明的最大迭代次数;exitflag>0表示
优化过程中变量收敛于解X,exitflag<0表示不收敛。output有3个分量,iterations表示优化过程的迭代次数,cgiterations表示PCG迭代次数,algorithm表示优化所采用的运算规则。lambda有4个分量,ineqlin是线性不等式约束条件,eqlin是线性等式约束条件,upper是变量的上界约束条件,lower是变量的下界约束条件。它们的返回值分别表示相应的约束条件在约束条件在优化过程中是否有效。
三、实验方法与步骤:
例1:某工厂生产A,B两种产品,所用原料均为甲、乙、丙三种:生产一件产品所需原料和所获利润以及库存原料情况如下所示: 原料甲(公斤) 原料乙(公斤) 原料丙(公斤) 利润(元) 产品A 8 4 4 7000 产品B 6 8 6 10000 库存原料量 380 300 220 在该厂只有表中所列库存原料的情况下,如何安排A,B两种产品的生产数量可以获得最大利润
设生产A产品x1件,生产B产品x2件,z为所获利润,我们将问题归结为如下的线性规划问题:
min{?(7000x1?10000x2)}
.
接着写出Matlab程序如下: clear
f=-[7000,10000]; A=[8,6;4,8;4,6]; b=[380,300,220];
[X,fval]=linprog(f,A,b) 运行结果为:
Optimization terminated. X =
fval =
+005
例2:求解下面的线性规划问题:
?8x1?6x2?380??4x1?8x2?300?4x?6x?2202?1
min{?5x1?4x2?6x3}
.
x1?x2?x3?20
3x1?2x2?4x3?42 3x1?2x2?30
0?x1,0?x2,0?x3
解决上述问题的Matlab程序为: Clear
f=-[5,4,6];
A=[1,-2,1;3,2,4;3,2,0]; b=[20,42,30]; LB=[0;0;0];
[X,fval,exitflag,output,lambda]=linprog(f,A,b,[],[],LB)
程序运行的结果为:
Optimization terminated. X =
fval =
exitflag =
1
output =
iterations: 6
algorithm: 'large-scale: interior point' cgiterations: 0
message: 'Optimization terminated.'
lambda =
ineqlin: [3x1 double] eqlin: [0x1 double] upper: [3x1 double] lower: [3x1 double]
四、实验总结
在使用linprog()命令时,系统默认它的参数至少为3个,但如果我们需要给定第5个参数,则第4个参数也必须给出,否则系统无法认定给出的是第5个参数。遇到无法给出时,则用空矩阵“[]”替代。
精心搜集整理,只为你的需要