第10章Matlab在最优化问题中的应用

时间:2022-10-12 17:53:20  热度:0°C

1、第10章 Matlab在最优化问题中的应用 优化理论是一门实践性很强的学科,广泛应用于生产管理、军事指挥和科学试验等各种领域,Matlab优化工具箱提供了对各种优化问题的一个完整的解决方案。在数学上,所谓优化问题,就是求解如下形式的最优解: Min fun (x) Sub/ to C/E/ B/C/其中fun (x)称为目标函数,“Sub/ to”为“subject to”的缩写,由其引导的部分称为约束条件。C/E/表示Condition Equations,即条件方程,可为等式方程,也可为不等式方程。B/C/表示Boundary Conditions,即边界条件,用来约束自变量的求解域,以l

2、bxub的形式给出。当C/E/为空时,此优化问题称为***优化或无约束优化问题;当C/E/不空时,称为有约束优化或强约束优化问题。在优化问题中,根据变量、目标函数和约束函数的不同,可以将问题大致分为:线性优化 目标函数和约束函数均为线性函数。二次优化 目标函数为二次函数,而约束条件为线性方程。线性优化和二次优化统称为简单优化。非线性优化 目标函数为非二次的非线性函数,或约束条件为非线性方程。多目标优化 目标函数并非一个时,称为多目标优化问题。本章将对以上几类优化问题在Matlab中的实现作比较详细的讲解。另外还将介绍两个利用优化方法解非线性方程的函数。通过本章的介绍,用户可以不必掌握艰涩的各种优

3、化算法而轻易地解决一些常用的最优化问题了。10/1 线性规划问题线性规划问题即目标函数和约束条件均为线性函数的问题。其标准形式为:min Cxsub/ To Ax = b x0其中C/ b/ 0Rn,ARmn,均为数值矩阵,xRn。若目标函数为:max Cx,则转换成:min Cx。标准形式的线性规划问题简称为LP(Linear Programming)问题。其它形式的线性规划问题经过适当的变换均可以化为此种标准形。线性规划问题虽然简单,但在工农业及其他生产部门中应用十分广泛。在Matlab中,线性规划问题由linprog函数求解。函数:linprog %求解如下形式的线性规划问题: such

4、 that 其中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/out

5、put/lambda = linprog(/)说明:x = linprog(f/A/b) 求解问题 min f*x,约束条件为A*x0 表示目标函数收敛于解x处;=0 表示已经达到函数评价或迭代的最大次数; f=-5/-4/-6/ A=1 -1 1/3 2 4/3 2 0/ b=20/42/30/ lb=zeros(3/1)/ x/fval/exitflag/output/lambda=linprog(f/A/b/lb)Optimization terminated successfully/x = 0/0000 15/0000 3/0000fval = -78/0000exitflag =

6、1output = iterations/ 6 cgiterations/ 0 algorithm/ lipsollambda = ineqlin/ 3x1 double eqlin/ 0x1 double upper/ 3x1 double lower/ 3x1 double lambda/ineqlinans = 0/0000 1/5000 0/5000 lambda/lowerans = 1/0000 0/0000 0/0000lambda向量中的非零元素表示哪些约束是主动约束。本例中,第2个和第3个不等式约束,第1个下界约束是主动约束(如这些解位于约束边界上)。exitflag = 1

7、表示过程正常收敛于解x处。例10-2 生产决策问题。某厂生产甲乙两种产品,已知制成一吨产品甲需资源A 3吨,资源B 4m3;制成一吨产品乙需资源A 2吨,资源B 6 m3;资源C 7个单位。若一吨产品甲和乙的经济价值分别为7万元和5万元,三种资源的***量分别为90吨、200 m3和210个单位,试决定应生产这两种产品各多少吨才能使创造的总经济价值最高?解:令生产产品甲的数量为x1,生产产品甲的数量为x2。由题意可以建立下面的数学模型: sub/ to 该模型中要求目标函数最大化,需要按照Matlab的要求进行转换,即目标函数为 在Matlab中实现: f=-7/-5/ A=3 2/4 6/0

8、7/ b=90/200/210/ lb=0/0/ x/fval/exitflag/output/lambda=linprog(f/A/b/lb)Optimization terminated successfully/x = 14/0000 24/0000fval = -218/0000exitflag = 1output = iterations/ 5 cgiterations/ 0 algorithm/ lipsollambda = ineqlin/ 3x1 double eqlin/ 0x1 double upper/ 2x1 double lower/ 2x1 double由上可知,生

9、产甲种产品14吨、乙种产品24吨可使创造的总经济价值最高为218万元。exitflag = 1表示过程正常收敛于解x处。例10-3 厂址选择问题。考虑A、B、C三地,每地都出产一定数量的原料也消耗一定数量的产品(见下表)。已知制成每吨产品需3吨原料,各地之间的距离为:AB:150km,AC:100km,BC:200km。假定每万吨原料运输1km的运价是5000元,每万吨产品运输1km的运价是6000元。由于地区条件的差异,在不同地点设厂的生产费用也不同。问究竟在哪些地方设厂,规模多大,才能使总费用最小?另外,由于其它条件***,在B处建厂的规模(生产的产品数量)不能超过5万吨。A、B、C三地出产

10、原料、消耗产品情况表地点年产原料(万吨)年销产品(万吨)生产费用(万元/万吨)A207150B1613120C240100解:令为由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 -1 1 -1 0 0 3 3 0 0 0 0 -1 1 0 0 1 -1 0 0 3 3 0 0 0 0 -

11、1 1 -1 1 0 0 0 0 3 3 0 0 0 0 0 0 0 0 1 1 0 0/ b=20/16/24/5/ Aeq=0 0 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 1 0 1 0 1/ beq=7/13/ lb=zeros(12/1)/ x/fval/exitflag/output/lambda=linprog(f/A/b/Aeq/beq/lb)Optimization terminated successfully/x = 0/0000 1/0000 0/0000 0/0000 0/0000 0/0000 7/0000 0/0000 0/0000 5/

12、0000 0/0000 8/0000fval = 3/4850e+003exitflag = 1output = iterations/ 8 cgiterations/ 0 algorithm/ lipsollambda = ineqlin/ 4x1 double eqlin/ 2x1 double upper/ 12x1 double lower/ 12x1 double因此,要使总费用最小,需要B地向A地运送1万吨原料,A、B、C三地的建厂规模分别为7万吨、5万吨、8万吨。最小总费用为3485万元。10/2 非线性规划问题10/2/1非线性无约束规划问题无约束规划由3个功能函数fminbn

13、d、fminsearch、fminunc实现。10/2/1/1 fminbnd函数函数: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 求取固定区间内

14、单变量函数的最小值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/

15、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必须为下面的形式 function f = myfun (x) f = %计算x处的函数值。options:优化参数选项

16、。你可以用optimset函数设置或改变这些参数的值。Options参数有以下几个选项: Display 显示的水平。选择off,不显示输出;选择iter,显示每一步迭代过程的输出;选择final,显示最终结果; MaxFunEvals 函数评价的最大允许次数; MaxIter 最大允许迭代次数; TolX x处的终止容限。exitflag:描述退出条件: 0 表示目标函数收敛于解x处; 0 表示已经达到函数评价或迭代的最大次数; x/y_min=fminbnd(sin(x)/0/2*pi)x = 4/7124y_min = -1/0000或 x/y_min=fminbnd(sin/0/2*p

17、i)x = 4/7124y_min = -1/0000例10-5 对边长为3m的正方形铁板,在四个角处剪去相等的小正方形以制成方形无盖盒子,问如何剪法使盒子容积最大?解:设剪去的正方形的边长为x,则盒子容积为 f (x) = (3-2x)2 x现在要求在区间(0/ 1/5)上确定x,使f (x)最大化。因为优化工具箱中要求目标函数最小化,所以需要对目标函数进行转换,即要求-f (x)最小化。在Matlab中实现: x/f_min=fminbnd(-(3-2*x)2*x/0/1/5)x = 0/5000f_min = -2/0000或编写M文件Ex1005/m x/f_min=fminbnd(E

18、x1005/0/1/5)x = 0/5000f_min = -2/0000即剪去边长为0/5 m的正方形,最大容积为2 m3。10/2/1/2 fminsearch函数函数: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

19、/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(/) 将

20、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函数有效,

21、但对于高度非线性不连续问题时,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/0016 0/8335f_min = -3/3241或在Matlab编辑器中编辑M文件Ex1006/m:function f=Ex1006(x)f=2*x(1)3+4*x(1)*x(2)

22、3-10*x(1)*x(2)+x(2)2/x0=0/0/命令窗口运行: x/f_min=fminsearch(Ex1006/x0)x = 1/0016 0/8335f_min = -3/3241运行后结果一致。10/2/1/3 fminunc函数函数:fminunc功能:求多变量无约束函数的最小值。数学模型: 其中,为向量,为一函数,返回标量。 格式:x = fminunc(fun/x0)x = fminunc(fun/x0/options)x = fminunc(fun/x0/options/P1/P2//)x/fval = fminunc(/)x/fval/exitflag = fminu

23、nc(/)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/opt

24、ions/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/

25、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必须有下面的形式:function f = myfun (x)f = %计算

26、x处的函数值。若fun函数的梯度可以算得,且options/GradObj设为on(用下式设定) options = optimset (GradObj/ on)则fun函数必须返回解x处的梯度向量g到第二个输出变量中去。注意,当被调用的fun函数只需要一个输出变量时(如算法只需要目标函数的值而不需要其梯度值时),可以通过核对nargout的值来避免计算梯度值functionf/ g = myfun (x)f = %计算x处的函数值if nargout 1 %调用fun函数并要求有两个输出变量 g = %计算x处的梯度值end若Hessian矩阵可以求得,并且options/ Hessian设

27、为on,即 options = optimset (Hessian/ on)则fun函数必须返回解x处的Hessian对称矩阵H到第三个输出变量中去。注意,当被调用的fun函数只需要一个或两个输出变量时(如算法只需要目标函数的值f和梯度值g而不需要Hessian矩阵H时),可以通过核对nargout的值来避免计算Hessian矩阵functionf/ g = myfun (x)f = %计算x处的函数值if nargout 1 %调用fun函数并要求有两个输出变量 g = %计算x处的梯度值 if nargout 2 H = %计算x处的Hessian矩阵endoptions变量:优化参数选项

28、。可以通过optimset函数设置或改变这些参数。其中有的参数适用于所有的优化算法,有的则只适用于大型优化问题,另外一些则只适用于中型问题。首先描述适用于大型问题的选项。这仅仅是一个参考,因为使用大型问题算法有一些条件。对于fminunc函数来说,必须提供梯度信息 LargeScale 当设为on时,使用大型算法,若设为off则使用中型问题的算法适用于大型和中型算法的参数: Diagnostics 打印最小化函数的诊断信息 Display 显示水平。选择off,不显示输出;选择iter,显示每一步迭代过程的输出;选择final,显示最终结果 GradObj 用户定义的目标函数的梯度。对于大型问

29、题此参数是必选的,对于中型问题则是可选项 MaxFunEvals 函数评价的最大次数 MaxIter 最大允许迭代次数 TolFun 函数值的终止容限 TolX x处的终止容限只适用于大型算法的参数: Hessian 用户定义的目标函数的Hessian矩阵 HessPattern 用于有限差分的Hessian矩阵的稀疏形式。若不方便求fun函数的稀疏Hessian矩阵H,可以通过用梯度的有限差分获得的H的稀疏结构(如非零值的位置等)来得到近似的Hessian矩阵H。若连矩阵的稀疏结构都不知道,则可以将HessPattern设为密集矩阵,在每一次迭代过程中,都将进行密集矩阵的有限差分近似(这是默

30、认设置)。这将非常麻烦,所以花一些力气得到Hessian矩阵的稀疏结构还是值得的 MaxPCGIter PCG迭代的最大次数 PrecondBandWidth PCG前处理的上带宽,默认时为零。对于有些问题,增加带宽可以减少迭代次数 TolPCG PCG迭代的终止容限 TypicalX 典型x值只适用于中型算法的参数: DerivativeCheck 对用户提供的导数和有限差分求出的导数进行对比 DiffMaxChange 变量有限差分梯度的最大变化 DiffMixChange 变量有限差分梯度的最小变化 LineSearchType 一维搜索算法的选择exitflag变量:描述退出条件: 0

31、 表示目标函数收敛于解x处 0 表示已经达到函数评价或迭代的最大次数 x0=1/1/ x/fval=fminunc(Ex10071/x0)Warning/ Gradient must be provided for trust-region method/ using line-search method instead/ In E/matlab6p1toolboxoptimfminunc/m at line 211 Optimization terminated successfully/ Search direction less than 2*options/TolXx = 1/0e-0

32、08 * -0/7591 0/2665fval = 1/3953e-016下面用提供的梯度g最小化函数,修改M文件为Ex10072/m:function f/g=Ex10072(x)f=3*x(1)2+2*x(1)*x(2)+x(2)2/if nargout1 g(1)=6*x(1)+2*x(2)/ g(2)=2*x(1)+2*x(2)/end下面通过将优化选项结构options/GradObj设置为on来得到梯度值。 options=optimset(GradObj/on)/ x0=1/1/ x/fval=fminunc(Ex10072/x0/options)Optimization ter

33、minated successfully/ First-order optimality less than OPTIONS/TolFun/ and no negative/zero curvature detectedx = 1/0e-015 * 0/1110 -0/8882fval = 6/2862e-031例10-8 求函数f (x) = e x1(4x12+2x22+4x1x2+2x2+1)的最小值。解:在Matlab中实现:x/fval/exitflag/output=fminunc(exp(x(1)*(4*x(1)2+2*x(2)2+4*x(1)*x(2)+2*x(2)+1)/-1

34、/1)Warning/ Gradient must be provided for trust-region method/ using line-search method instead/ In E/matlab6p1toolboxoptimfminunc/m at line 211 Optimization terminated successfully/ Current search direction is a descent direction/ and magnitude of directional derivative in search direction less tha

35、n 2*options/TolFunx = 0/5000 -1/0000fval = 1/3028e-010exitflag = 1output = iterations/ 7 funcCount/ 40 stepsize/ 1 firstorderopt/ 8/1998e-004 algorithm/ medium-scale/ Quasi-Newton line search例10-9 求无约束非线性问题 f (x) = 100 (x2-x12)2+(1-x1)2 x0 = -1/2/ 1解:在Matlab中实现: x0=-1/2/1/ x/fval=fminunc(100*(x(2)-x

36、(1)2)2+(1-x(1)2/x0)Warning/ Gradient must be provided for trust-region method/ using line-search method instead/ In E/matlab6p1toolboxoptimfminunc/m at line 211Optimization terminated successfully/ Current search direction is a descent direction/ and magnitude of directional derivative in search dir

37、ection less than 2*options/TolFunx = 1/0000 1/0000fval = 1/9116e-01110/2/2 二次规划数学模型:如果某非线性规划的目标函数为自变量的二次函数,约束条件全是线性函数,就称这种规划为二次规划。其数学模型为 其中,和为矩阵,和为向量。函数:quadprog功能:求解二次规划问题。格式:x = quadprog(H/f/A/b)x = quadprog(H/f/A/b/Aeq/beq)x = quadprog(H/f/A/b/Aeq/beq/lb/ub)x = quadprog(H/f/A/b/Aeq/beq/lb/ub/x0)x

38、 = quadprog(H/f/A/b/Aeq/beq/lb/ub/x0/options)x = quadprog(H/f/A/b/Aeq/beq/lb/ub/x0/options/p1/p2//)x/fval = quadprog(/)x/fval/exitflag = quadprog(/)x/fval/exitflag/output = quadprog(/)x/fval/exitflag/output/lambda = quadprog(/)说明:x = quadprog(H/f/A/b) 返回向量x,最小化函数1/2*x*H*x+f*x,其约束条件为A*x=b。x = quadprog(H/f/A/b/Aeq/beq) 仍求上面的解,但添加了等式约束条件Aeq*x = beq。x = quadprog(H/f/A/b/Aeq/beq/lb/ub) 定义设计变量的下界lb和上界ub,使得lb=x H=1 -1/-1 2/ f=-2/-6/ A=1 1/-1 2/2 1/ b=2/2/3/ lb=zeros(2/1

郑重声明:
1. 《第10章Matlab在最优化问题中的应用》内容来源于互联网,版权归原著者或相关公司所有。
2. 若《86561825文库网》收录的文本内容侵犯了您的权益或隐私,请立即通知我们删除。