Matlab在最优化问题中的应用Word文件下载.docx
《Matlab在最优化问题中的应用Word文件下载.docx》由会员分享,可在线阅读,更多相关《Matlab在最优化问题中的应用Word文件下载.docx(48页珍藏版)》请在冰豆网上搜索。
![Matlab在最优化问题中的应用Word文件下载.docx](https://file1.bdocx.com/fileroot1/2022-11/27/fc8682f1-61d9-4b97-9c7b-d37290ac415d/fc8682f1-61d9-4b97-9c7b-d37290ac415d1.gif)
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:
lower:
lambda.ineqlin
ans=
1.5000
0.5000
lambda.lower
1.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];
14.0000
24.0000
-218.0000
5
[2x1double]
由上可知,生产甲种产品14吨、乙种产品24吨可使创造的总经济价值最高为218万元。
例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
100
令
为由i地运到j地的原料数量(万吨),
为由i地运到j地的产品数量(万吨),i,j=1,2,3(分别对应A、B、C三地)。
根据题意,可以建立问题的数学模型(其中目标函数包括原料运输费、产品运输费和生产费用(万元)):
在Matlab中实现:
f=[75;
75;
50;
100;
150;
240;
210;
120;
160;
220];
A=[1-11-100330000
-11001-1003300
00-11-11000033
000000001100];
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)
7.0000
5.0000
8.0000
3.4850e+003
8
[4x1double]
[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表示已经达到函数评价或迭代的最大次数;
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)
4.7124
y_min=
-1.0000
或
[x,y_min]=fminbnd(@sin,0,2*pi)
例10-5对边长为3m的正方形铁板,在四个角处剪去相等的小正方形以制成方形无盖盒子,问如何剪法使盒子容积最大?
设剪去的正方形的边长为x,则盒子容积为
f(x)=(3-2x)2x
现在要求在区间(0,1.5)上确定x,使f(x)最大化。
因为优化工具箱中要求目标函数最小化,所以需要对目标函数进行转换,即要求-f(x)最小化。
[x,f_min]=fminbnd('
-(3-2*x)^2*x'
0,1.5)
f_min=
-2.0000
或编写M文件Ex1005.m
[x,f_min]=fminbnd(@Ex1005,0,1.5)
即剪去边长为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)
1.00160.8335
-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)
运行后结果一致。
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。
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。
x=fminunc(inline('
norm(x)^2'
),x0)
同样,fun函数可以是一个包含函数名的字符串。
若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的值来避免计算梯度值