•最优化问题是专门研究如何从多个方案中科学合理地提出最佳方案,其过程是找出反映实际问题最优化所要达到的目标和各种约束条件,即建立数学模型,并合理选择优化方法对模型进行求解。•本章重点•函数最值问题•线性规划问题•非线性规划问题•整数规划问题•二次规划问题第九章最优化计算9.1无约束优化问题无约束优化问题就是在没有约束条件下寻求目标函数的最小值或最大值。本节主要利用MATLAB中的函数求解一元函数和多元函数在区间上的最值问题。9.1.1一元函数最小值单变量函数在某区间上求最小值的标准形式为:12xminf(x)xxx格式:X=fminbnd(FUN,x1,x2)X=fminbnd(FUN,x1,x2,OPTIONS)[X,FVAL,EXITFLAG,OUTPUT]=fminbnd说明:FUN为目标函数的表达式字符串、MATLAB自定义函数的函数柄或句柄函数。x1、x2指自变量x在区间的左右端点。OPTIONS用于指定优化参数选项,包括显示水平、允许计算误差、迭代次数、算法等。X为返回区间上函数FUN的最小值点。若EXITFLAG0,则X为解;否则,X不是最终解,它只是迭代终止时优化过程的值。FVAL为目标函数最优值。EXITFLAG为返回算法的终止标志,若EXITFLAG=1表示目标函数收敛于解X处,说明优化收敛到局部最优解;EXITFLAG=0表示已经达到函数评价或迭代的最大次数,说明优化失败;EXITFLAG=-1表示算法终止、输出,EXITFLAG=-2表示优化过程超出区间范围,EXITFLAG0目标函数不收敛。OUTPUT为输出优化信息,有4个分量,iterations表示优化过程的迭代次数,funcCount表示函数评价次数,algorithm表示所采用的算法,message表示优化退出信息。对于最大值问题,需转换为最小值处理:f(x)在区间[a,b]上的最小值就是f(x)在区间[a,b]上的最大值。【例】计算函数xy=esinx1在区间[-1,1]上的最小值。(1)直接在命令窗口中输入目标函数字符串。[X,FVAL,EXITFLAG,OUTPUT]=fminbnd('(exp(x)-sin(x)-1)',-1,1)X=4.3009e-06FVAL=9.2486e-12EXITFLAG=1OUTPUT=iterations:10funcCount:11algorithm:'goldensectionsearch,parabolicinterpolation'message:'Optimizationterminated:thecurrentxsatisfiestheterminationcriteriausingOPTIONS.TolXof1.000000e-04andF(X)sati...'(2)先自定义函数。在MATLAB编辑器中建立函数M文件为:functionf=fun1(x)f=exp(x)-sin(x)-1;end保存为fun1.m,然后在命令窗口键入命令:[X,FVAL]=fminbnd(@fun1,-1,1)%或fminbnd('fun1',-1,1)X=4.3009e-06FVAL=9.2486e-12(3)利用句柄函数。在命令窗口键入命令:fun2=@(x)exp(x)-sin(x)-1fun2=@(x)exp(x)-sin(x)-1[X,FVAL]=fminbnd(fun2,-1,1)X=4.3009e-06FVAL=9.2486e-12结果显示x近似为0时,函数最小值也为09.1.2多元函数最小值无约束多元函数最小值的标准形式为:xminf(x)x为向量1.利用fminsearch函数求最小值格式:X=fminsearch(FUN,X0)X=fminsearch(FUN,X0,OPTIONS)[X,FVAL,EXITFLAG,OUTPUT]=fminsearch(...)说明:FUN表示目标函数的表达式字符串、MATLAB自定义函数的函数柄、句柄函数或内联函数;X0为初始值;OPTIONS用于指定优化参数选项。X为最优解。FVAL为目标函数最优值。EXITFLAG返回算法的终止标志,若EXITFLAG=1表示目标函数收敛于解X处,说明优化收敛到局部最优解;EXITFLAG=0表示已经达到函数评价或迭代的最大次数,说明优化失败;EXITFLAG=-1表示算法终止、输出,说明没有收敛到局部最优解X。OUTPUT为输出优化信息,iterations表示优化过程的迭代次数,funcCount表示函数评价次数,algorithm表示采用Nelder-Mead型简单搜寻法的算法,message表示优化退出信息。2.利用函数fminunc求最小值格式:X=fminunc(FUN,X0)X=fminunc(FUN,X0,OPTIONS)[X,FVAL,EXITFLAG,OUTPUT,GRAD,HESSIAN]=fminunc(FUN,X0,...)说明:FUN为目标函数的表达式字符串、MATLAB自定义函数的函数柄、句柄函数或内联函数;X0为初始值;OPTIONS用于指定优化参数选项。X为指定初始点X0处的最小值点。FVAL为目标函数最优值。若EXITFLAG=1,则梯度在函数值最终允许误差内;若EXITFLAG=2,则在变量x的最终允许误差内;若EXITFLAG=3,则目标函数值在函数值最终允许误差内;若EXITFLAG=5,则预测目标函数下降小于在函数值最终允许误差内;若EXITFLAG=0,则表示已经达到函数评价或迭代的最大次数,说明优化失败;若EXITFLAG=-1,则表示算法终止、输出,说明没有收敛到局部最优解X处;若EXITFLAG=-3,则表示目标函数无界。EXITFLAG正值都表示收敛到局部最优解X处。OUTPUT:Iterations表示优化过程的迭代次数;funcCount表示函数评价次数;stepsize表示最终步长的大小(只用在中型算法);firstorderopt表示一阶优化的度量,解X处梯度的范数;algorithm表示所采用的优化算法;message表示优化退出信息。GRAD;目标函数在最优解X点的梯度值。HESSIAN:目标函数在最优解X点的Hessian矩阵值。【例】求函数2211212y=xxx+6x+x的最小值。fun5=inline('x(1)^2-x(1)*x(2)+6*x(1)+x(2)^2');x0=[-1,-1];[X,FVAL,EXITFLAG,OUTPUT,GRAD,HESSIAN]=fminunc(fun5,x0)X=-4.0000-2.0000FVAL=-12.0000EXITFLAG=1OUTPUT=iterations:7funcCount:24stepsize:1firstorderopt:4.5896e-06algorithm:'quasi-newton'message:'Localminimumfound.GRAD=1.0e-05*0.0834-0.4590HESSIAN=2.0000-1.0000-1.00002.00003.控制参数OPTIONS的设置(1)常用的几个参数。Display:显示水平,取值为“off”时,不显示输出;取值为“iter”时,显示迭代次数;取值为“final”时,显示最终输出(默认值);取值为“notify”表示在函数不收敛时显示输出。MaxFunEvals:允许函数估值的最大次数,取值为正整数。MaxIter:允许迭代的最大次数,取值为正整数。TolCon:约束变量最终允许误差。TolX:变量X最终允许误差。TolFun:函数值最终允许误差。(2)参数OPTIONS选项是采用optimset函数来设置的。格式:OPTIONS=optimset(OPTIMFUNCTION)说明:创建一个含所有参数名,并与优化函数OPTIMFUNCTION相关的默认值选项结构的OPTIONS。例如,OPTIONS=optimset('fminbnd')(或optimset(@fminbnd))返回一个最优化的选项结构,它包含所有的参数名和默认值,相当于优化函数fminbnd。格式:OPTIONS=optimset('PARAM1',VALUE1,'PARAM2',VALUE2,...)说明:创建一个名称为OPTIONS的优化选项参数,其中PARAM1,PARAM2为优化参数名,VALUE1,VALUE2为指定的参数对应的指定值,所有未指定的参数取默认值。例如,OPTIONS=optimset('Display',iter,'TolFun',1e-8)返回指定参数Display为iter,TolFun取1e-8,其它参数为默认值的优化结构OPTIONS。格式:OPTIONS=optimset(OLDOPTS,'PARAM1',VALUE1,...)说明:创建名称为OLDOPTS的参数的复制,用指定的参数值修改OLDOPTS中相应的参数。例如,从原有的基础上添加允许函数最优解的误差为1e-8,则可以做设置如下:OPTIONS=optimset(OPTIONS,'TolX',1e-8)其中,函数optimset内的OPTIONS为原先的设置,TolX为添加设置。优化参数的选项由optimset给出,详细内容只需在MATLAB命令窗口中输入optimset,即可显示所有信息,由于最优化参数设置的参数太多,在此省略。格式:OPTIONS=optimset(OLDOPTS,NEWOPTS)说明:将已经存在的选项结构OLDOPTS与新的选项结构NEWOPTS进行合并。NEWOPTS参数中的所有元素将覆盖OLDOPTS参数中所有对应元素。4.fminunc的算法说明(1)有大型优化和中型优化算法,由options中的参数LargeScale控制。LargeScale=’on’(默认值),使用大型算法。LargeScale=’off’(默认值),使用中型算法。(2)为中型优化算法的搜索方向提供4种算法,由options中的参数HessUpdate控制。HessUpdate=’bfgs’(默认值),拟牛顿法的BFGS公式。HessUpdate=’dfp’(默认值),拟牛顿法的DFP公式。HessUpdate=’steepdesc’,快速下降法。9.2约束优化问题约束优化问题就是在有约束条件下寻求目标函数的最小值或最大值。本节主要利用MATLAB中的函数求解线性规划、非线性规划、整数规划和二次规划等问题。9.2.1线性规划问题线性规划问题是目标函数和约束条件均为线性函数,其标准形式为:其中,f、x、b、beq、LB、UB为列向量,A、Aeq为矩阵。fT为目标函数的系数行向量,x为决策向量。A和b分别为不等式约束表达式左端的系数矩阵和右端的常数向量;Aeq和beq分别为等式约束表达式左端的系数矩阵和右端的常数向量;LB、UB为x的下界和上界。目标函数:Txminfx约束条件:Axb,Aeqx=beq,LBxUB如果求解目标函数的最大值,则只需将目标函数乘以负值,就转化为求最小值。解出后再把目标函数的符号改回来。若不等式约束是大于等于形式,只需在不等式两端乘上负号,即可改为小于等于形式。格式:X=linprog(f,A,b)%不等式约束Axb的目标函数f的最优解XX=linprog(f,A,b,Aeq,beq)%含有等式约束Aeqx=beq。若没有不等式%约束Axb,则A=[],b=[]X=linprog(f,A,b,Aeq,beq,LB,UB))%指定x的范围LBxUB。若没有等式%约束Aeqx=beq,则Aeq=[],beq=[]X=linprog(f,A,b,Aeq,beq,lb,ub,X0)%设置初值X0[X,FVAL,EXITFLAG,OUTPUT,LAMBDA]=linprog(f,A,b)说明:X为最优解。FVAL为目标函数最优值。若EXITF