第10章Matlab在最优化问题中的应用.docx
《第10章Matlab在最优化问题中的应用.docx》由会员分享,可在线阅读,更多相关《第10章Matlab在最优化问题中的应用.docx(47页珍藏版)》请在冰豆网上搜索。
第10章Matlab在最优化问题中的应用
第10章Matlab在最优化问题中的应用
优化理论是一门实践性很强的学科,广泛应用于生产管理、军事指挥和科学试验等各种领域,Matlab优化工具箱提供了对各种优化问题的一个完整的解决方案。
在数学上,所谓优化问题,就是求解如下形式的最优解:
Minfun(x)
Sub.to[C.E.]
[B.C.]
其中fun(x)称为目标函数,“Sub.to”为“subjectto”的缩写,由其引导的部分称为约束条件。
[C.E.]表示ConditionEquations,即条件方程,可为等式方程,也可为不等式方程。
[B.C.]表示BoundaryConditions,即边界条件,用来约束自变量的求解域,以lb≤x≤ub的形式给出。
当[C.E.]为空时,此优化问题称为自由优化或无约束优化问题;当[C.E.]不空时,称为有约束优化或强约束优化问题。
在优化问题中,根据变量、目标函数和约束函数的不同,可以将问题大致分为:
·线性优化目标函数和约束函数均为线性函数。
·二次优化目标函数为二次函数,而约束条件为线性方程。
线性优化和二次优化统称为简单优化。
·非线性优化目标函数为非二次的非线性函数,或约束条件为非线性方程。
·多目标优化目标函数并非一个时,称为多目标优化问题。
本章将对以上几类优化问题在Matlab中的实现作比较详细的讲解。
另外还将介绍两个利用优化方法解非线性方程的函数。
通过本章的介绍,用户可以不必掌握艰涩的各种优化算法而轻易地解决一些常用的最优化问题了。
10.1线性规划问题
线性规划问题即目标函数和约束条件均为线性函数的问题。
其标准形式为:
minC’x
sub.ToAx=b
x≥0
其中C,b,0∈Rn,A∈Rmn,均为数值矩阵,x∈Rn。
若目标函数为:
maxC’x,则转换成:
min–C’x。
标准形式的线性规划问题简称为LP(LinearProgramming)问题。
其它形式的线性规划问题经过适当的变换均可以化为此种标准形。
线性规划问题虽然简单,但在工农业及其他生产部门中应用十分广泛。
在Matlab中,线性规划问题由linprog函数求解。
函数:
linprog%求解如下形式的线性规划问题:
suchthat
其中f,x,b,beq,lb,ub为向量,A,Aeq为矩阵。
格式:
x=linprog(f,A,b)
x=linprog(f,A,b,Aeq,beq)
x=linprog(f,A,b,Aeq,beq,lb,ub)
x=linprog(f,A,b,Aeq,beq,lb,ub,x0)
x=linprog(f,A,b,Aeq,beq,lb,ub,x0,options)
[x,fval]=linprog(...)
[x,fval,exitflag]=linprog(...)
[x,fval,exitflag,output]=linprog(...)
[x,fval,exitflag,output,lambda]=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,fval,exitflag]=linprog(...)返回exitflag值,描述函数计算的退出条件。
[x,fval,exitflag,output]=linprog(...)返回包含优化信息的输出变量output。
[x,fval,exitflag,output,lambda]=linprog(...)将解x处的Lagrange乘子返回到lambda参数中。
exitflag参数
描述退出条件:
·>0表示目标函数收敛于解x处;
·=0表示已经达到函数评价或迭代的最大次数;
·<0表示目标函数不收敛。
output参数
该参数包含下列优化信息:
·output.iterations迭代次数;
·output.cgiterationsPCG迭代次数(只适用于大型规划问题);
·output.algorithm所采用的算法。
lambda参数
该参数是解x处的Lagrange乘子。
它有以下一些属性:
·lambda.lower—lambda的下界;
·lambda.upper—lambda的上界;
·lambda.ineqlin—lambda的线性不等式;
·lambda.eqlin—lambda的线性等式。
例10-1求解下列优化问题:
min
sub.to
解:
在Matlab命令窗口键入:
>>f=[-5;-4;-6];
>>A=[1-11;324;320];
>>b=[20;42;30];
>>lb=zeros(3,1);
>>[x,fval,exitflag,output,lambda]=linprog(f,A,b,[],[],lb)
Optimizationterminatedsuccessfully.
x=
0.0000
15.0000
3.0000
fval=
-78.0000
exitflag=
1
output=
iterations:
6
cgiterations:
0
algorithm:
'lipsol'
lambda=
ineqlin:
[3x1double]
eqlin:
[0x1double]
upper:
[3x1double]
lower:
[3x1double]
>>lambda.ineqlin
ans=
0.0000
1.5000
0.5000
>>lambda.lower
ans=
1.0000
0.0000
0.0000
lambda向量中的非零元素表示哪些约束是主动约束。
本例中,第2个和第3个不等式约束,第1个下界约束是主动约束(如这些解位于约束边界上)。
exitflag=1表示过程正常收敛于解x处。
例10-2生产决策问题。
某厂生产甲乙两种产品,已知制成一吨产品甲需资源A3吨,资源B4m3;制成一吨产品乙需资源A2吨,资源B6m3;资源C7个单位。
若一吨产品甲和乙的经济价值分别为7万元和5万元,三种资源的限制量分别为90吨、200m3和210个单位,试决定应生产这两种产品各多少吨才能使创造的总经济价值最高?
解:
令生产产品甲的数量为x1,生产产品甲的数量为x2。
由题意可以建立下面的数学模型:
sub.to
该模型中要求目标函数最大化,需要按照Matlab的要求进行转换,即目标函数为
在Matlab中实现:
>>f=[-7;-5];
>>A=[32;46;07];
>>b=[90;200;210];
>>lb=[0;0];
>>[x,fval,exitflag,output,lambda]=linprog(f,A,b,[],[],lb)
Optimizationterminatedsuccessfully.
x=
14.0000
24.0000
fval=
-218.0000
exitflag=
1
output=
iterations:
5
cgiterations:
0
algorithm:
'lipsol'
lambda=
ineqlin:
[3x1double]
eqlin:
[0x1double]
upper:
[2x1double]
lower:
[2x1double]
由上可知,生产甲种产品14吨、乙种产品24吨可使创造的总经济价值最高为218万元。
exitflag=1表示过程正常收敛于解x处。
例10-3厂址选择问题。
考虑A、B、C三地,每地都出产一定数量的原料也消耗一定数量的产品(见下表)。
已知制成每吨产品需3吨原料,各地之间的距离为:
A—B:
150km,A—C:
100km,B—C:
200km。
假定每万吨原料运输1km的运价是5000元,每万吨产品运输1km的运价是6000元。
由于地区条件的差异,在不同地点设厂的生产费用也不同。
问究竟在哪些地方设厂,规模多大,才能使总费用最小?
另外,由于其它条件限制,在B处建厂的规模(生产的产品数量)不能超过5万吨。
A、B、C三地出产原料、消耗产品情况表
地点
年产原料(万吨)
年销产品(万吨)
生产费用(万元/万吨)
A
20
7
150
B
16
13
120
C
24
0
100
解:
令为由i地运到j地的原料数量(万吨),为由i地运到j地的产品数量(万吨),i,j=1,2,3(分别对应A、B、C三地)。
根据题意,可以建立问题的数学模型(其中目标函数包括原料运输费、产品运输费和生产费用(万元)):
min
sub.to
在Matlab中实现:
>>f=[75;75;50;50;100;100;150;240;210;120;160;220];
>>A=[1-11-100330000
-11001-1003300
00-11-11000033
000000001100];
>>b=[20;16;24;5];
>>Aeq=[000000101010
000000010101];
>>beq=[7;13];
>>lb=zeros(12,1);
>>[x,fval,exitflag,output,lambda]=linprog(f,A,b,Aeq,beq,lb)
Optimizationterminatedsuccessfully.
x=
0.0000
1.0000
0.0000
0.0000
0.0000
0.0000
7.0000
0.0000
0.0000
5.0000
0.0000
8.0000
fval=
3.4850e+003
exitflag=
1
output=
iterations:
8
cgiterations:
0
algorithm:
'lipsol'
lambda=
ineqlin:
[4x1double]
eqlin:
[2x1double]
upper:
[12x1double]
lower:
[12x1doubl