运用Matlab进行线性规划求解实例
- 格式:doc
- 大小:53.00 KB
- 文档页数:3
8.2 线性规划线性规划是处理线性目标函数和线性约束的一种较为成熟的方法,目前已经广泛应用于军事、经济、工业、农业、教育、商业和社会科学等许多方面。
8.2.1 基本数学原理线性规划问题的标准形式是:⎪⎪⎪⎪⎩⎪⎪⎪⎪⎨⎧≥=+++=+++=++++++=0,,,min 21221122222121112121112211n m n mn m m n n n n n n x x x b x a x a x a b x a x a x a b x a x a x a x c x c x c z 或⎪⎪⎪⎩⎪⎪⎪⎨⎧=≥===∑∑==n j x m i b x a x c z j n j i j ij n j jj ,,2,1,0,,2,1,min 11写成矩阵形式为:⎪⎩⎪⎨⎧≥==O X b AX CX z min线性规划的标准形式要求使目标函数最小化,约束条件取等式,变量b 非负。
不符合这几个条件的线性模型可以转化成标准形式。
MATLAB 采用投影法求解线性规划问题,该方法是单纯形法的变种。
8.2.2 有关函数介绍在MATLAB 工具箱中,可用linprog 函数求解线性规划问题。
linprog 函数的调用格式如下:●x=linprog(f,A,b):求解问题minf'*x ,约束条件为A*x<=b 。
●x=linprog(f,A,b,Aeq,beq):求解上面的问题,但增加等式约束,即Aeq*x=beq 。
若没有不等式约束,则令A=[ ],b=[ ]。
●x=linprog(f,A,b,Aeq,beq,lb,ub):定义设计x 的下界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 指定的优化参数进行最小化。
应用Matlab 优化工具箱中的linprog 函数求解线性规划时模型要求为如下形式: ⎪⎩⎪⎨⎧≤≤=≤⋅M x x m x dx C b Ax .t .s xc min 其中:M x ,x ,m x 均为列向量,C ,A 为常数矩阵,d ,b ,c '为常数列向量。
函数调用格式如下:);xM ,xm ,d ,C ,b ,A ,c (linprog ]z ,x [= %决策变量有上下界,默认变量非负。
例1-38 用Matlab 求解下面线性规划问题1212121212max 1502102310034120..55150,0z x x x x x x s t x x x x =++≤⎧⎪+≤⎪⎨+≤⎪⎪≥⎩令z1= -zMATLAB 求解程序存为liti2.mc=[-150,-210];A=[2,3;3,4;5,5];b=[100;120;150];C=[];d=[];xm=[0;0];xM=10^10*[1;1];[x,z1]=linprog(c,A,b,C,d,xm,xM)Optimization terminated.在命令窗口键入liti2.m,按回车得最优解和最优值x =0.000030.0000z1 =-6.3000e+003故最优解为 x 1=0,x 2=30; 最优值为z=-z1=6300.通常在LINGO 中建立优化模型由MODEL 语句开始,由END 语句结束。
模型中包含四部分(即四段):集合(SETS )、数据段(DATA )、初始段(INIT )、目标和约束段。
(1) 集合段: 它是以 SETS 开始,ENDSETS 结束,其作用是定义所用集合变量及元素(数组的下标),以及相应的属性(数组)。
(2) 数据段:它是以 DA TA 开始,ENDDATA 结束,其作用是对集合段中定义的属性(数组)赋值(常数)。
数据之间用逗号分开或用空格分开。
(3) 初始段:它是以INIT 开始,ENDINTI 结束,其作用是对集合段中定义的属性(变量数组)赋迭代初值。
在Matlab优化工具箱(Optimization Toolbox)中,求解(1.5.1)的程序如下:[x,fval,exitflag,output,lambda] = linprog (c,A,b,Aeq,beq,lb,ub,x0,options)注意关键标识符意义:1)x0是线性规划的初始解,这种设计仅对中规模算法有效,通常可以缺省。
2)输出是最优解,fval是最优值3)输出exitflag描述了程序的运行情况,若其值大于零,表示程序收敛到最优解;若其值等于零,表示计算达到了最大次数;若其值小于零,表示问题无可行解,或程序运行失败。
4)输出output表示程序运行的某些信息,如迭代次数(iterations)、所用算法(algorithm)、共轭梯度(cgiterations)等。
5)lambda表示解处的拉格朗日乘子,其中lower,upper,ineqlin,eqlin分别对应于下界、上界、不等式约束与等式约束。
解 Matlab 程序如下:c=[-2,-1,1]; 求解目标函数的系数矩阵 A=[1,4,-1;2,-2,1]; A 是不等式约束的系数矩阵 b=[4;12]; b 是不等式约束相应的常数列向量Aeq=[1,1,2]; Aeq 是等式约束的系数矩阵beq=6; beq 是等式约束相应的常数列向量,若没有等式约束,则均用[]代替;lb=[0,0,-inf];ub=[inf,inf,5]; 如果某个变量无下界,则用-inf 表示;如果某个变量无上界,则用inf 表示,若决策变量 无下界,则lb 用[]代替;若决策变量 无上界,则ub 用[]代替;[x,z]=linprog(c,A,b,Aeq,beq,lb,ub) 123123123123123226442212005min z x x x x x x x x x s.t.x x x x ,x ,x =--+++=⎧⎪+-≤⎪⎨-+≤⎪⎪≥≥≤⎩运行后得到输出Optimization terminated successfully. x=4.66670.00000.6667z=-8.6667。
Matlab求解线性规划和整数规划问题线性规划和整数规划是数学规划中常见的两种优化问题。
Matlab作为一种强大的数值计算软件,提供了丰富的工具和函数来解决这些问题。
本文将介绍如何使用Matlab求解线性规划和整数规划问题,并提供详细的步骤和示例代码。
一、线性规划问题的求解线性规划问题可以表示为如下形式的数学模型:```minimize c'*xsubject to A*x <= blb <= x <= ub```其中,c是目标函数的系数向量,x是决策变量向量,A是不等式约束矩阵,b 是不等式约束向量,lb和ub分别是决策变量的下界和上界。
Matlab中求解线性规划问题可以使用`linprog`函数。
下面是一个示例:```matlabc = [1; 2; 3]; % 目标函数的系数向量A = [1, -1, 2; 3, 1, 0]; % 不等式约束矩阵b = [4; 5]; % 不等式约束向量lb = zeros(3, 1); % 决策变量的下界ub = [Inf; Inf; 10]; % 决策变量的上界[x, fval] = linprog(c, A, b, [], [], lb, ub);```在上面的示例中,我们定义了目标函数的系数向量c,不等式约束矩阵A,不等式约束向量b,以及决策变量的下界lb和上界ub。
然后使用`linprog`函数求解线性规划问题,得到最优解x和最优目标函数值fval。
二、整数规划问题的求解整数规划问题是线性规划问题的一个扩展,要求决策变量取整数值。
Matlab中求解整数规划问题可以使用`intlinprog`函数。
下面是一个示例:```matlabc = [1; 2; 3]; % 目标函数的系数向量A = [1, -1, 2; 3, 1, 0]; % 不等式约束矩阵b = [4; 5]; % 不等式约束向量lb = zeros(3, 1); % 决策变量的下界ub = [Inf; Inf; 10]; % 决策变量的上界intcon = [1; 2]; % 决策变量的整数约束[x, fval] = intlinprog(c, intcon, A, b, [], [], lb, ub);```在上面的示例中,我们除了定义了线性规划问题的参数外,还定义了决策变量的整数约束intcon。
Matlab求解线性规划和整数规划问题Matlab是一种强大的数学计算工具,可以用于求解各种数学问题,包括线性规划和整数规划问题。
本文将详细介绍如何使用Matlab求解线性规划和整数规划问题,并提供相应的代码示例和结果分析。
一、线性规划问题的求解线性规划问题是一类常见的数学优化问题,其目标是在一组线性约束条件下,找到使目标函数最优化的变量值。
在Matlab中,可以使用线性规划函数“linprog”来求解线性规划问题。
下面以一个简单的线性规划问题为例进行说明。
假设有如下线性规划问题:目标函数:maximize 2x1 + 3x2约束条件:x1 + x2 ≤ 5x1 - x2 ≤ 2x1, x2 ≥ 0首先,我们需要定义目标函数的系数矩阵和约束条件的系数矩阵。
在Matlab 中,可以使用矩阵来表示这些系数。
可以按照以下方式定义:c = [-2; -3]; % 目标函数的系数矩阵A = [1 1; 1 -1]; % 约束条件的系数矩阵b = [5; 2]; % 约束条件的右侧常数然后,我们可以使用“linprog”函数来求解线性规划问题。
代码如下:x = linprog(c, A, b); % 求解线性规划问题最后,我们可以输出求解结果,并进行结果分析。
代码如下:disp('最优解为:')disp(x)disp('目标函数的最优值为:')disp(-c'*x)运行以上代码,即可得到线性规划问题的最优解和目标函数的最优值。
在这个例子中,最优解为x1=2,x2=3,目标函数的最优值为-13。
二、整数规划问题的求解整数规划问题是线性规划问题的一种扩展,其变量需要取整数值。
在Matlab 中,可以使用整数规划函数“intlinprog”来求解整数规划问题。
下面以一个简单的整数规划问题为例进行说明。
假设有如下整数规划问题:目标函数:minimize 2x1 + 3x2约束条件:x1 + x2 ≥ 5x1 - x2 ≤ 2x1, x2 ≥ 0x1, x2为整数首先,我们需要定义目标函数的系数矩阵和约束条件的系数矩阵。
matlab最优化问题的经典例题MATLAB最优化问题的经典例题之一是线性规划问题。
线性规划是一种数学优化方法,用于寻找一组给定线性约束条件下使得目标函数达到最大或最小值的变量值。
假设有以下线性规划问题:最大化目标函数:Z = c1*x1 + c2*x2 + ... + cn*xn在满足约束条件:A*x <= bx >= 0下,求解变量x1, x2, ..., xn的最优解。
使用MATLAB求解该线性规划问题的代码如下:```% 定义目标函数系数向量cc = [c1; c2; ...; cn];% 定义不等式约束条件系数矩阵A和右侧常数向量bA = [A11, A12, ..., A1n;A21, A22, ..., A2n;...,Am1, Am2, ..., Amn];b = [b1; b2; ...; bm];% 定义变量的下界和上界lb = zeros(n, 1); % 下界为0,即 x >= 0ub = Inf(n, 1); % 上界为无穷大,即无上界% 求解线性规划问题[x, fval] = linprog(-c, A, b, [], [], lb, ub);% 输出最优解和最优值disp('最优解:')disp(x)disp('最优值:')disp(-fval)```在上述代码中,我们将目标函数系数向量c、不等式约束条件系数矩阵A和右侧常数向量b、变量的下界和上界lb、ub传递给linprog函数进行求解。
linprog函数返回最优解x和最优值-fval(由于linprog默认求解最小化问题,我们使用-c作为目标函数系数向量,将最大化问题转化为最小化问题)。
通过以上代码,我们可以求解线性规划问题的最优解和最优值,并使用MATLAB进行验证和分析。
这个例题可以帮助我们理解和掌握MATLAB中最优化问题的求解方法。
8.2 线性规划
线性规划是处理线性目标函数和线性约束的一种较为成熟的方法,目前已经广泛应用于军事、经济、工业、农业、教育、商业和社会科学等许多方面。
8.2.1 基本数学原理
线性规划问题的标准形式是:
⎪⎪⎪⎪⎩
⎪⎪⎪⎪⎨⎧≥=+++=+++=++++++=0,,,min 21221122222121112
121112211n m n mn m m n n n n n n x x x b x a x a x a b x a x a x a b x a x a x a x c x c x c z ΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛ 或
⎪⎪⎪⎩
⎪⎪⎪⎨⎧=≥===∑∑==n j x m i b x a x c z j n j i j ij n j j
j ,,2,1,0,,2,1,min 1
1ΛΛ
写成矩阵形式为:
⎪⎩
⎪⎨⎧≥==O X b AX CX z min
线性规划的标准形式要求使目标函数最小化,约束条件取等式,变量b 非负。
不符合这几个条件的线性模型可以转化成标准形式。
MATLAB 采用投影法求解线性规划问题,该方法是单纯形法的变种。
8.2.2 有关函数介绍
在MATLAB 工具箱中,可用linprog 函数求解线性规划问题。
linprog 函数的调用格式如下:
●x=linprog(f,A,b):求解问题minf'*x ,约束条件为A*x<=b 。
●x=linprog(f,A,b,Aeq,beq):求解上面的问题,但增加等式约束,即Aeq*x=beq 。
若没有不等式约束,则令A=[ ],b=[ ]。
●x=linprog(f,A,b,Aeq,beq,lb,ub):定义设计x 的下界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(…):返回解x 处的目标函数值fval 。
●[x,lambda,exitflag]=linpro g(…):返回exitflag 值,描述函数计算的退出条件。
●[x,lambda,exitflag,output]=linprog(…):返回包含优化信息的输出参数output 。
●[x,fval,exitflag,output,lambda]=linprog(…):将解x 处的拉格朗日乘子返回到
lambda 参数中。
调用格式中,lambda 参数为解x 处包含拉格朗日乘子的结构。
它有以下一些字段:
lower —下界lb
upper —上界ub
ineqlin —线性不等式
eqlin —线性等式
exitflag 参数表示算法终止的原因,下面列出不同值对应的退出原因:
1 函数在解x 处有解
0 迭代次数超过options.MaxIter
-2 没有找到可行点
-3 问题无解
-4 执行算法时遇到NaN
-5 原问题和对偶问题都不可行
-7 搜索方向太小,不能继续前进。
8.2.3 应用实例
例8-2 某河流边有两个化工厂,流经第一个化工厂的河水流量是每天500万立方米,在两个工厂之间有一条流量为200万立方米的支流(如图8-1所示)。
第一个化工厂每天排放工业污水2万立方米,第二个化工厂每天排放工业污水1.4万立方米,从第一个化工厂排出的污水流到第二个化工厂之前,有20%可自然净化。
根据环保要求,河流中工业污水的含量应不大于0.2%,因此两个化工厂都必须各自处理净化一部分污水,第一个化工厂处理污水的成本是0.1元∕立方米,第二个化工厂处理污水的成本是0.08元∕立方米。
问在满足环保要求的条件下,各化工厂每天应处理多少污水,才能使两厂总的处理污水费用最少?
第一化工厂 第二化工厂
图8-1
解:设1x ,2x 分别表示第一个化工厂和第二个化工厂每天处理的污水量(万立方米∕天)。
则目标函数:218001000x x f +=(元∕天)
约束条件1:
%2.0500
21≤-x ,即11≥x ; 约束条件2:%2.0700
)4.1()2(8.021≤-+-x x ,即6.18.021≥+x x ; 约束条件3:⎩⎨⎧≤≤4.1221x x 。
因此,该问题的线性规划模型归结为:
218001000m in x x f +=
⎪⎪⎪⎩
⎪⎪⎪⎨⎧≥≤≤-≤---≤-0,4.12
6.18.01..2121211x x x x x x x t s 求解程序:
%线性规划问题
f=[1000 800];
A=[-1 0;-0.8 -1;1 0;0 1];
b=[-1;-1.6;2;1.4];
lb=zeros(2,1);
[x,fval,exitflag]=linprog(f,A,b,[],[],lb)
运行结果:
x =
1.0000
0.8000
fval =1.6400e+003
exitflag =1
由上可知,第一个化工厂每天处理的污水量为1万立方米∕天,第二个化工厂每天处理的污水量为0.8万立方米∕天,才能使两厂总的处理污水费用最少。