Matlab在最优化问题中的应用.docx
- 文档编号:17026861
- 上传时间:2023-07-21
- 格式:DOCX
- 页数:60
- 大小:132.30KB
Matlab在最优化问题中的应用.docx
《Matlab在最优化问题中的应用.docx》由会员分享,可在线阅读,更多相关《Matlab在最优化问题中的应用.docx(60页珍藏版)》请在冰点文库上搜索。
Matlab在最优化问题中的应用
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∈Rm
n,均为数值矩阵,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:
[12x1double]
因此,要使总费用最小,需要B地向A地运送1万吨原料,A、B、C三地的建厂规模分别为7万吨、5万吨、8万吨。
最小总费用为3485万元。
10.2非线性规划问题
10.2.1非线性无约束规划问题
无约束规划由3个功能函数fminbnd、fminsearch、fminunc实现。
10.2.1.1fminbnd函数
函数:
fminbnd
功能:
求取固定区间内单变量函数的最小值,也就是一元函数最小值问题。
数学模型:
式中,
和
为标量,
为函数,返回标量。
格式:
x=fminbnd(fun,x1,x2)
x=fminbnd(fun,x1,x2,options)
x=fminbnd(fun,x1,x2,options,P1,P2,...)
[x,fval]=fminbnd(...)
[x,fval,exitflag]=fminbnd(...)
[x,fval,exitflag,output]=fminbnd(...)
说明:
fminbnd求取固定区间内单变量函数的最小值
x=fminbnd(fun,x1,x2)返回[x1,x2]区间上fun参数描述的标量函数的最小值点x。
x=fminbnd(fun,x1,x2,options)用options参数指定的优化参数进行最小化。
x=fminbnd(fun,x1,x2,options,P1,P2,...)提供另外的参数P1,P2等,传输给目标函数fun。
如果没有设置options选项,则令options=[]。
[x,fval]=fminbnd(...)返回解x处目标函数的值。
[x,fval,exitflag]=fminbnd(...)返回exitflag值描述fminbnd函数的退出条件。
[x,fval,exitflag,output]=fminbnd(...)返回包含优化信息的结构输出。
·fun:
需要最小化的目标函数。
fun函数需要输入标量参数x,返回x处的目标函数标量值f。
可以将fun函数指定为命令行,如
x=fminbnd(inline(‘sin(x*x)’),x0)
同样,fun参数可以是一个包含函数名的字符串。
对应的函数可以是M文件、内部函数或MEX文件。
若fun=‘myfun’,则
x=fminbnd(@myfun,x0)
其中M文件函数myfun.m必须为下面的形式
functionf=myfun(x)
f=…%计算x处的函数值。
·options:
优化参数选项。
你可以用optimset函数设置或改变这些参数的值。
Options参数有以下几个选项:
·Display显示的水平。
选择’off’,不显示输出;选择’iter’,显示每一步迭代过程的输出;选择’final’,显示最终结果;
·MaxFunEvals函数评价的最大允许次数;
·MaxIter最大允许迭代次数;
·TolXx处的终止容限。
·exitflag:
描述退出条件:
·>0表示目标函数收敛于解x处;
·0表示已经达到函数评价或迭代的最大次数;
·<0表示目标函数不收敛。
·output:
该参数包含下列优化信息:
·output.iteratiions迭代次数;
·output.algorithm所采用的算法;
·output.funcCount函数评价次数。
注意:
(1)目标函数必须是连续的;
(2)fminbnd函数可能只给出局部最优解;
(3)当问题的解位于区间边界上时,fminbnd函数的收敛速度常常很慢。
此时,fmincon函数的计算速度更快,计算精度更高;
(4)fminbnd函数只用于实数变量。
例10-4在(0,
上求函数sinx的最小值。
解:
Matlab中实现:
>>[x,y_min]=fminbnd('sin(x)',0,2*pi)
x=
4.7124
y_min=
-1.0000
或
>>[x,y_min]=fminbnd(@sin,0,2*pi)
x=
4.7124
y_min=
-1.0000
例10-5对边长为3m的正方形铁板,在四个角处剪去相等的小正方形以制成方形无盖盒子,问如何剪法使盒子容积最大?
解:
设剪去的正方形的边长为x,则盒子容积为
f(x)=(3-2x)2x
现在要求在区间(0,1.5)上确定x,使f(x)最大化。
因为优化工具箱中要求目标函数最小化,所以需要对目标函数进行转换,即要求-f(x)最小化。
在Matlab中实现:
>>[x,f_min]=fminbnd('-(3-2*x)^2*x',0,1.5)
x=
0.5000
f_min=
-2.0000
或编写M文件Ex1005.m
>>[x,f_min]=fminbnd(@Ex1005,0,1.5)
x=
0.5000
f_min=
-2.0000
即剪去边长为0.5m的正方形,最大容积为2m3。
10.2.1.2fminsearch函数
函数:
fminsearch
功能:
求解多变量无约束函数的最小值。
数学模型:
其中,
为向量,
为一函数,返回标量。
格式:
x=fminsearch(fun,x0)
x=fminsearch(fun,x0,options)
x=fminsearch(fun,x0,options,P1,P2,...)
[x,fval]=fminsearch(...)
[x,fval,exitflag]=fminsearch(...)
[x,fval,exitflag,output]=fminsearch(...)
说明:
fminsearch求解多变量无约束函数的最小值。
该函数常用于无约束非线性最优化问题。
x=fminsearch(fun,x0)初值为x0,求fun函数的局部极小点x。
x0可以是标量、向量或矩阵。
x=fminsearch(fun,x0,options)用options参数指定的优化参数进行最小化。
x=fminsearch(fun,x0,options,P1,P2,...)将问题参数P1、P2等直接输给目标函数fun,将options参数设置为空矩阵,作为options参数的默认值。
[x,fval]=fminsearch(...)将x处的目标函数值返回到fval参数中。
[x,fval,exitflag]=fminsearch(...)返回exitflag值,描述函数的退出条件。
[x,fval,exitflag,output]=fminsearch(...)返回包含优化信息参数output的结构输出。
各变量的意义同前及下面fminunc函数。
注意:
(1)应用fminsearch函数可能会得到局部最优解;
(2)fminsearch函数只对实数进行最小化,即x必须由实数组成,f(x)函数必须返回实数。
如果x为复数,则必须将它分为实数部和虚数部两部分;
(3)对于求解二次以上的问题,fminunc函数比fminsearch函数有效,但对于高度非线性不连续问题时,fminsearch函数更具稳键性。
(4)fminsearch函数不适合求解平方和问题,用lsqnonlin函数更好一些。
例10-6求2x13+4x1x23-10x1x2+x22的最小值。
解:
在Matlab中实现如下:
>>f='2*x
(1)^3+4*x
(1)*x
(2)^3-10*x
(1)*x
(2)+x
(2)^2';
>>x0=[0,0];
>>[x,f_min]=fminsearch(f,x0)
x=
1.00160.8335
f_min=
-3.3241
或在Matlab编辑器中编辑M文件Ex1006.m:
functionf=Ex1006(x)
f=2*x
(1)^3+4*x
(1)*x
(2)^3-10*x
(1)*x
(2)+x
(2)^2;
x0=[0,0];
命令窗口运行:
>>[x,f_min]=fminsearch(@Ex1006,x0)
x=
1.00160.8335
f_min=
-3.3241
运行后结果一致。
10.2.1.3fminunc函数
函数:
fminunc
功能:
求多变量无约束函数的最小值。
数学模型:
其中,
为向量,
为一函数,返回标量。
格式:
x=fminunc(fun,x0)
x=fminunc(fun,x0,options)
x=fminunc(fun,x0,options,P1,P2,...)
[x,fval]=fminunc(...)
[x,fval,exitflag]=fminunc(...)
[x,fval,exitflag,output]=fminunc(...)
[x,fval,exitflag,output,grad]=fminunc(...)
[x,fval,exitflag,output,grad,hessian]=fminunc(...)
说明:
fminunc给定初值,求多变量标量函数的最小值。
常用于无约束非线性最优化问题。
x=fminunc(fun,x0)给定初值x0,求fun函数的局部极小点x。
x0可以是标量、向量或矩阵。
x=fminunc(fun,x0,options)用options参数指定的优化参数进行最小化。
x=fminunc(fun,x0,options,P1,P2,...)将问题参数P1、P2等直接输给目标函数fun,将options参数设置为空矩阵,作为options参数的默认值。
[x,fval]=fminunc(...)将x处的目标函数值返回到fval参数中。
[x,fval,exitflag]=fminunc(...)返回exitflag值,描述函数的退出条件。
[x,fval,exitflag,output]=fminunc(...)返回包含优化信息参数output的结构输出。
[x,fval,exitflag,output,grad]=fminunc(...)将解x处fun函数的梯度值返回到grad参数中。
[x,fval,exitflag,output,grad,hessian]=fminunc(...)将解x处目标函数的Hessian矩阵信息返回到hessian参数中。
·fun变量:
为目标函数。
需要最小化的目标函数。
fun函数需要输入向量参数x,返回x处的目标函数标量值f。
可以将fun函数指定为命令行,如
x=fminunc(inline('norm(x)^2'),x0)
同样,fun函数可以是一个包含函数名的字符串。
对应的函数可以是M文件、内部函数或MEX文件。
若fun=‘myfun’,则
x=fminunc(@myfun,x0)
其中M文件函数myfun.m必须有下面的形式:
functionf=myfun(x)
f=…%计算x处的函数值。
若fun函数的梯度可以算得,且options.GradObj设为’on’(用下式设定)
options=optimset(‘GradObj’,‘on’)
则fun函数必须返回解x处的梯度向量g到第二个输出变量中去。
注意,当被调用的fun函数只需要一个输出变量时(如算法只需要目标函数的值而不需要其梯度值时),可以通过核对nargout的值来避免计算梯度值
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Matlab 优化 问题 中的 应用