1§最小化问题一、单变量最小化1.相关函数介绍(1)fminbnd2功能:找到固定区间内单变量函数的最小值。语法和描述:fminbnd求取固定区间内单变量函数的最小值。x=fminbnd(fun,x1,x2)返回区间{x1,x2}上fun参数描述的标量函数的最小值x。x=fminbnd(fun,x1,x2,options)用options参数指定的优化参数进行最小化。fminbnd3x=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(...)返回包含优化信息的结构输出。4参数描述表参数描述fun需要最小化的目标函数。fun函数需要输入标量参数x,返回x处的目标函数标量值f。可以将fun函数指定为命令行,如x=fminbnd(inline('sin(x*x)'),x0)同样,fun参数可以是一个包含函数名的字符串。对应的函数可以是M文件、内部函数或MEX文件。若fun='myfun',则M文件函数myfun.m必须右下面的形式。functionf=myfun(x)f=...%计算x处的函数值。5options优化参数选项。你可以用optimset函数设置或改变这些参数的值。options参数有以下几个选项:●Display–显示的水平。选择'off',不显示输出;选择'iter',显示每一步迭代过程的输出;选择'final',显示最终结果。●MaxFunEvals–函数评价的最大允许次数。lMaxIter–最大允许迭代次数。lTolX–x处的终止容限。6exitflag描述退出条件:l0表示目标函数收敛于解x处。l0表示已经达到函数评价或迭代的最大次数。l0表示目标函数不收敛。output该参数包含下列优化信息:loutput.iterations–迭代次数。loutput.algorithm–所采用的算法。loutput.funcCount–函数评价次数。7算法:fminbnd是一个M文件。其算法基于黄金分割法和二次插值法。局限性:1.目标函数必须是连续的。2.fminbnd函数可能只给出局部最优解。3.当问题的解位于区间边界上时,fminbnd函数的收敛速度常常很慢。此时,fmincon函数的计算速度更快,计算精度更高。4.fminbnd函数只用于实数变量。8应用实例[例1]在区间(0,2π)上求函数sin(x)的最小值:x=fminbnd(@sin,0,2*pi)x=4.71249[例2].对边长为3m的正方形铁板,在四个角处剪去相等的正方形以制成方形无盖水槽,问如何剪法使水槽的容积最大?模型建立:假设剪去的正方形的边长为x,则水槽的容积为()2v32xx现在要求在区间(0,1.5)上确定一个x,使最大化。因为优化工具箱中要求目标函数最小化,所以需要对目标函数进行转换,即要求最小化。10首先编写M文件opt21_3o.m:functionf=myfun(x)f=-(3-2*x).^2*x;然后调用fminbnd函数(磁盘中M文件名为opt21_3.m):x=fminbnd(@opt21_3o,0,1.5)11无约束非线性规划问题相关函数fminunc函数fminsearch函数12fminunc函数功能:给定初值,求多变量标量函数的最小值。常用于无约束非线性最优化问题。数学模型:其中,x为一向量,f(x)为一函数,返回标量。min()xfx13语法格式及描述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参数的缺省值。14[x,fval]=fminunc(...)将解x处目标函数的值返回到fval参数中。[x,fval,exitflag]=fminunc(...)返回exitflag值,描述函数的输出条件。[x,fval,exitflag,output]=fminunc(...)返回包含优化信息的结构输出。[x,fval,exitflag,output,grad]=fminunc(...)将解x处fun函数的梯度值返回到grad参数中。[x,fval,exitflag,output,grad,hessian]=fminunc(...)将解x处目标函数的Hessian矩阵信息返回到hessian参数中。15参数描述表变量描述fun为目标函数。需要最小化的目标函数。fun函数需要输入标量参数x,返回x处的目标函数标量值f。若fun='myfun',则M文件函数myfun.m必须有下面的形式:functionf=myfun(x)f=...%计算x处的函数值。16options优化参数选项。可以通过optimset函数设置或改变这些参数。其中有的参数适用于所有的优化算法,有的则只适用于大型优化问题,另外一些则只适用于中型问题。首先描述适用于大型问题的选项。这仅仅是一个参考,因为使用大型问题算法有一些条件。对于fminunc函数来说,必须提供梯度信息。lLargeScale–当设为'on'时使用大型算法,若设为'off'则使用中型问题的算法。17适用于大型和中型算法的参数:lDiagnostics–打印最小化函数的诊断信息。lDisplay–显示水平。选择'off',不显示输出;选择'iter',显示每一步迭代过程的输出;选择'final',显示最终结果。打印最小化函数的诊断信息。lGradObj–用户定义的目标函数的梯度。对于大型问题此参数是必选的,对于中型问题则是可选项。lMaxFunEvals–函数评价的最大次数。lMaxIter–最大允许迭代次数。lTolFun–函数值的终止容限。lTolX–x处的终止容限。18只用于大型算法的参数:lHessian–用户定义的目标函数的Hessian矩阵。lHessPattern–用于有限差分的Hessian矩阵的稀疏形式。若不方便求fun函数的稀疏Hessian矩阵H,可以通过用梯度的有限差分获得的H的稀疏结构(如非零值的位置等)来得到近似的Hessian矩阵H。若连矩阵的稀疏结构都不知道,则可以将HessPattern设为密集矩阵,在每一次迭代过程中,都将进行密集矩阵的有限差分近似(这是缺省设置)。这将非常麻烦,所以花一些力气得到Hessian矩阵的稀疏结构还是值得的。19lMaxPCGIter–PCG迭代的最大次数。lPrecondBandWidth–PCG前处理的上带宽,缺省时为零。对于有些问题,增加带宽可以减少迭代次数。lTolPCG–PCG迭代的终止容限。lTypicalX–典型x值。只用于中型算法的参数:lDerivativeCheck–对用户提供的导数和有限差分求出的导数进行对比。lDiffMaxChange–变量有限差分梯度的最大变化。lDiffMinChange-变量有限差分梯度的最小变化。lLineSearchType–一维搜索算法的选择。20exitflag描述退出条件:l0表示目标函数收敛于解x处。l0表示已经达到函数评价或迭代的最大次数。l0表示目标函数不收敛。21output该参数包含下列优化信息:loutput.iterations–迭代次数。loutput.algorithm–所采用的算法。loutput.funcCount–函数评价次数。loutput.cgiterations–PCG迭代次数(只适用于大型规划问题)。loutput.stepsize–最终步长的大小(只用于中型问题)。loutput.firstorderopt–一阶优化的度量:解x处梯度的范数。22习题4-6%目标函数m文件,保存为xiti4j6.mfunctionf=myfun(x);f=10*x(1)^2+x(2)^2-20*x(1)-4*x(2)+24;%求解m文件options=optimset('display','on','maxiter',10e5,'tolfun',10e-5,'tolx',0.01);x0=[2,-1];[x,fval,exigflag,hessian]=fminunc(@xiti4j6,x0,options)23x=1.00002.0007fval=10.0000exigflag=1hessian=iterations:6funcCount:21stepsize:1firstorderopt:0.0013algorithm:'medium-scale:Quasi-Newtonlinesearch'24例:初始点[1,1]程序:编辑ff2.m文件:functionf=ff(x)f=8*x(1)-4*x(2)+x(1)^2+3*x(2)^2;编辑command.m文件x0=[1,1];%取初始点:[x,fval,exitflag]=fminunc(@ff,x0)25Optimizationterminatedsuccessfully:Searchdirectionlessthan2*options.TolXx=-4.00000.6667fval=-17.3333exitflag=126注意1.对于求解平方和的问题,fminunc函数不是最好的选择,用lsqnonlin函数效果更佳。2.使用大型方法时,必须通过将options.GradObj设置为'on'来提供梯度信息,否则将给出警告信息。27局限性1.目标函数必须是连续的。fminunc函数有时会给出局部最优解。2.fminunc函数只对实数进行优化,即x必须为实数,而且f(x)必须返回实数。当x为复数时,必须将它分解为实部和虚部。28fminsearch函数功能:求解多变量无约束函数的最小值。该函数常用于无约束非线性最优化问题。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参数的缺省值。语法格式及描述:29[x,fval]=fminsearch(...)将x处的目标函数值返回到fval参数中。[x,fval,exitflag]=fminsearch(...)返回exitflag值,描述函数的退出条件。[x,fval,exitflag,output]=fminsearch(...)返回包含优化信息的输出参数output。参数:各参数的意义同fminunc。30fminunc与fminsearch对于求解二次以上的问题,fminsearch比fminunc更有效,而且当问题为高度非线性时,前者更有效。fminsearch不适合求解平方和的问题,用lsqnolin更好。31三、约束最小化相关函数介绍fmincon函数32功能:求多变量有约束非线性函数的最小值。fmincon函数数学模型:min()()0()0xfxcxceqxAXbAeqXbeqlbXub其中,x,b,beq,lb,和ub为向量,A和Aeq为矩阵,c(x)和ceq(x)为函数,返回标量。f(x),c(x),和ceq(x)可以是非线性函数。非线性不等式约束非线性等式约束线性