则nonlcon函数必须在第三个和第四个输出变量中返回c (x)的梯度GC和ceq (x)的梯度GCeq。当被调用的nonlcon函数只需要两个输出变量(此时优化算法只需要c和ceq的值,而不需要GC和GCeq)时,可以通过查看nargout的值来避免计算GC和GCeq的值。
function [c, ceq, GC, GCeq] = mycon (x) c = … %解x处的非线性不等式 ceq =… %解x处的非线性等式
if nargout>2 %被调用的nonlcon函数,要求有4个输出变量 GC = … %不等式的梯度 GCeq = … %等式的梯度 end
若nonlcon函数返回m元素的向量c和长度为n的x,则c (x)的梯度GC是一个n×m的矩阵,其中GC(i, j)是c (j)对x (i)的偏导数。同样,若ceq是一个p元素的向量,则ceq (x)的梯度GCeq是一个n×p的矩阵,其中GCeq(i, j)是ceq (j)对x (i)的偏导数。
其它参数意义同前。 注意:
(1)大型优化问题:
(1.1)使用大型算法,必须在fun函数中提供梯度信息(options.GradObj设置
为’on’)。如果没有梯度信息,则将给出警告信息。
Fmincon函数允许g (x)为一近似梯度,但使用真正的梯度将使优化过程更具稳
键性。
(1.2)当对矩阵的二阶导数(即Hessian矩阵)进行计算后,用该函数求解大型
问题将更有效。但不需要求得真正的Hessian矩阵,如果能提供Hessian矩阵稀疏结构的信息(用options参数的HessPattern属性),则fmincon函数可以算得Hessian矩阵的稀疏有限差分近似。
(1.3)若x0不是严格可行的,则fmincon函数选择一个新的严格可行初始点。 (1.4)若x的某些元素没有上界或下界,则fmincon函数更希望对应的元素设置
为Inf(对于上界)或-Inf(对于下界),而不希望强制性地给上界赋一个很大的值,给下界一个很小的负值。
(1.5)线性约束最小化课题中也有几个问题需要注意:
·Aeq矩阵中若存在密集列或近密集列(A dense or fairly dense column),
会导致满秩并使计算费时;
·fmincon函数剔除Aeq中线性相关的行。此过程需要进行反复的因子分解,因
此,如果相关行很多的话,计算将是一件很费时的事情; ·每一次迭代都要用下式进行稀疏最小二乘求解 B?AeqTR?T 其中RT为前提条件的Cholesky(乔累斯基)因子。 (2)中型优化问题:
(2.1)如果用Aeq和beq清楚地提供等式约束,将比用lb和ub获得更好的数值
解。
(2.2)在二次子问题中,若有等式约束并且因等式(dependent equalities)被
发现和剔除的话,将在过程标题中显示’ dependent’(当output参数要求使用options.Display = ‘iter’)。只有在等式连续的情况下,因等式才会被剔除。若等式系统不连续,则子问题将不可行并在过程标题中打印’infeasible’信息。
(3)求大型优化问题的代码中不允许上限和下限相等,即不能有lb (2)= =ub (2),否则给出下面的出错信息:
Equal upper and lower bounds not permitted in this large-scale method. Use equality constraints and the medium-scale method instead.
若只有等式约束,仍然可以使用大型算法。当既有等式约束又有边界约束时,使用中型算法。
(4)目标函数和约束函数都必须是连续的,否则可能会只给出局部最优解。 (5)当问题不可行时,fmincon函数将试图使最大约束值最小化。 (6)目标函数和约束函数都必须是实数。
(7)对于大型优化问题,使用大型优化算法时,用户必须在fun函数中提供梯度(options参数的GradObj属性必须设置为’on’),并且只可指定上界和下界约束,或者只有线性约束必须存在,Aeq的行数不能多于列数。
(8)如果在fun函数中提供了解析梯度,选项参数DerivativeCheck不能与大型方法一起用,以比较解析梯度和有限差分梯度。可以通过将options参数的MaxIter属性设置为0来用中型方法核对导数,然后用大型方法求解问题。
例10-11 求解下列优化问题: 目标函数
f(x)??x1x2x3 约束条件
0?x1?2x2?2x3?72 解:将约束条件改写成下面的不等式 ?x1?2x2?2x3?0 x1?2x2?2x3?72
两个约束条件都是线性的,在Matlab中实现: >> x0=[10;10;10];
>> A=[-1 -2 -2;1 2 2]; >> b=[0;72];
>> [x,fval]=fmincon('-x(1)*x(2)*x(3)',x0,A,b)
Warning: Large-scale (trust region) method does not currently solve this type of problem,
switching to medium-scale (line search).
> In E:\\matlab6p1\\toolbox\\optim\\fmincon.m at line 213 Optimization terminated successfully:
Magnitude of directional derivative in search direction
less than 2*options.TolFun and maximum constraint violation is less than options.TolCon Active Constraints: 2 x =
24.0000 12.0000 12.0000 fval =
-3456
线性不等式约束条件的值<=0 >> A*x-b ans = -72 0
2
例10-12 求表面积为常数150 m的体积最大的长方体体积。
解:设长方体的长、宽、高分别为x1、x2和x3,根据题意得到下面的数学模型: min z= - x1 x2 x3
2 (x2 x3 + x3 x1 + x1 x2) = 150
由于约束条件是非线性等式约束,所以需要编写一个约束条件M文件Ex1012c.m: function [c,ceq]=Ex1012c(x)
ceq=x(2)*x(3)+x(3)*x(1)+x(1)*x(2)-75
在Matlab中实现: >> x0=[4;5;6]; >> lb=zeros(3,1); >>
[x,fval,exitflag,output,lambda]=fmincon('-x(1)*x(2)*x(3)',x0,[],[],[],[],lb,[],@Ex1012c)
Warning: Large-scale (trust region) method does not currently solve this type of problem,
switching to medium-scale (line search). Optimization terminated successfully:
Search direction less than 2*options.TolX and
maximum constraint violation is less than options.TolCon Active Constraints: 1 x =
5.0000 5.0000 5.0000 fval = -125.0000 exitflag = 1 output =
iterations: 7 funcCount: 38 stepsize: 1
algorithm: 'medium-scale: SQP, Quasi-Newton, line-search' firstorderopt: [] cgiterations: [] lambda =
lower: [3x1 double] upper: [3x1 double] eqlin: [0x1 double] eqnonlin: 2.5000
ineqlin: [0x1 double] ineqnonlin: [0x1 double]
优化结果显示过程成功收敛,搜索方向小于两倍options.TolX,最大违约值小于options.TolCon,主动约束为1个。
3
问题的解为x (1) = x (2) = x (3) = 5.0000m,最大体积为125.0000m。exitflag = 1,表示过程成功收敛于解x处。output输出变量显示了收敛过程中的迭代次数、目标函数计算次数、步长、算法等信息。lambda则包含模型信息。
例10-13 求解下列优化问题:
22?2x2?2x1x2?4x1?6x2 min 2x1 ?x1?5x2??5 ?2x12?x2?0
0?x1,0?x2
初始点x0 = [0; 0.75]。
解:由于约束条件中有非线性不等式,所以需要编写一个约束条件M文件Ex1013c.m: function [c,ceq]=Ex1013c(x)
c=2*x(1)^2-x(2); 在Matlab中实现: >> x0=[0;0.75]; >> A=[1 5]; >> b=5;
>> lb=zeros(2,1);
>>[x,fval,exitflag,output,lambda]=fmincon('2*x(1)^2+2*x(2)^2-2*x(1)*x(2)-4*
x(1)-6*x(2)',x0,A,b,[],[],lb,[],@Ex1013c)
Warning: Large-scale (trust region) method does not currently solve this type of problem,
switching to medium-scale (line search). Optimization terminated successfully:
Search direction less than 2*options.TolX and
maximum constraint violation is less than options.TolCon Active Constraints: 3 4 x =
0.6589 0.8682 fval = -6.6131 exitflag = 1 output =
iterations: 6 funcCount: 27 stepsize: 1
algorithm: 'medium-scale: SQP, Quasi-Newton, line-search' firstorderopt: [] cgiterations: [] lambda =
lower: [2x1 double] upper: [2x1 double] eqlin: [0x1 double] eqnonlin: [0x1 double] ineqlin: 0.9419 ineqnonlin: 0.8192
问题的解为x (1) = 0.6589,x (2) = 0.8682,最小值为 -6.6131。 例10-14 求解下列优化问题:
13 ?x?2?0 初始点x = 0。
解:约束条件是线性约束。在Matlab中实现: >> x0=0; >> A=-1; >> b=-2;
>> [x,fval]=fmincon('1/3*(x-1)^3',x0,A,b)
min (x?1)3
Warning: Large-scale (trust region) method does not currently solve this type of problem,
switching to medium-scale (line search).
> In E:\\matlab6p1\\toolbox\\optim\\fmincon.m at line 213 Optimization terminated successfully:
Search direction less than 2*options.TolX and
maximum constraint violation is less than options.TolCon Active Constraints: 1 x = 2 fval = 0.3333
10.3 目标规划
前面介绍的最优化方法只有一个目标函数,是单目标最优化方法。但是,在许多实际工程问题中,往往希望多个指标都达到最优值,所以它有多个目标函数。这种问题称为多目标最优化问题。
多目标最优化问题的数学模型为
minF(x)
x?Rn Gi(x)?0 Gi(x)?0i?1,2,?,m1
i?m1?1,m1?2,?,m
xi?x?xu 其中F(x)为目标函数向量。
此优化问题在Matlab中主要由函数fgoalattain来实现。此问题在控制系统中有广泛的应用。
函数:fgoalattain
功能:求解多目标达到问题。 数学模型:
minimize?
x,? F(x)?weight???goal c(x)?0 ceq(x)?0 A?x?b
Aeq?x?beq lb?x?ub
其中x,weight,goal,b,beq,lb和ub为向量,A和Aeq为矩阵,c (x),ceq (x)和F (x)为函数,返回向量。F (x),c (x) 和ceq (x)可以是非线性函数。 格式:x = fgoalattain(fun,x0,goal,weight)
x = fgoalattain(fun,x0,goal,weight,A,b)
x = fgoalattain(fun,x0,goal,weight,A,b,Aeq,beq)
x = fgoalattain(fun,x0,goal,weight,A,b,Aeq,beq,lb,ub)
x = fgoalattain(fun,x0,goal,weight,A,b,Aeq,beq,lb,ub,nonlcon)
x = fgoalattain(fun,x0,goal,weight,A,b,Aeq,beq, lb,ub,nonlcon,options) x = fgoalattain(fun,x0,goal,weight,A,b,Aeq,beq,
lb,ub,nonlcon,options,P1,P2,...)
[x,fval] = fgoalattain(...)
相关推荐: