数学建模讲座(2004年7月~8月江西)优化模型与MATLAB优化工具箱谢金星清华大学数学科学系Tel:010-62787812Email:jxie@math.tsinghua.edu.cn~jxie简要提纲•MATLAB优化工具箱简介•控制参数•主要功能的使用解非线性方程(组):特殊的优化问题最小二乘法:特殊的优化问题LP;QP;NLP•建模与求解实例(结合软件使用)优化模型实际问题中的优化模型mixgtsxxxxfzMaxMiniTn,2,1,0)(..),(),()(1或x~决策变量f(x)~目标函数gi(x)0~约束条件数学规划线性规划(LP)二次规划(QP)非线性规划(NLP)纯整数规划(PIP)混合整数规划(MIP)整数规划(IP)0-1整数规划一般整数规划连续规划MATLAB优化工具箱能求解的优化模型优化工具箱3.0(MATLAB7.0R14)连续优化离散优化无约束优化非线性极小fminunc非光滑(不可微)优化fminsearch非线性方程(组)fzerofsolve全局优化暂缺非线性最小二乘lsqnonlinlsqcurvefit线性规划linprog纯0-1规划bintprog一般IP(暂缺)非线性规划fminconfminimaxfgoalattainfseminf上下界约束fminbndfminconlsqnonlinlsqcurvefit约束线性最小二乘lsqnonneglsqlin约束优化二次规划quadprogMATLAB优化工具箱能求解的优化模型xi=0,1MATLAB优化工具箱能求解的优化模型MATLAB优化工具箱能求解的优化模型MATLAB优化工具箱能求解的优化模型需要掌握的几个重要方面问题模型及其输入格式输出格式及其含义选项(OPTIONS)函数选项的含义optimset函数optimget函数fzero:单变量方程f(x)=0求根(变号点)最简形式x=fzero(@f,x0)可选输入:“P1,P2,...”是传给f.m的参数(如果需要的话)’opt’是一个结构变量,控制参数(如精度TolX)输出:fv是函数值;ef是停止原因(1,0,-1);out是一个结构变量,包含:iterations(迭代次数),funcCount(函数调用次数),algorithm(所用算法)一般形式[x,fv,ef,out]=fzero(@f,x0,opt,P1,P2,...)必须输入:f为f.m的函数名,x0是迭代初值(或有根区间)输出:x是近似变号点(函数不连续时不一定是根)演示:exampleFzero.mfsolve:多变量方程组F(x)=0求解输出----与fzero类似,但’out’中输出更多:还输出’firstorderopt’,即结果(x点)处梯度向量的范数(实际上是1-范数,即分量按绝对值取最大的值);’jac’输出x点所对应的雅可比矩阵输入----与fzero类似,但’opt’中控制参数更多(如MaxFunEvals,MaxIter等)最简形式x=fsolve(@f,x0)一般形式[x,fv,ef,out,jac]=fsolve(@f,x0,opt,P1,P2,...)注:solve函数也可求解(符号工具箱)演示:exampleFsolve.m;exampleSolve.mfminunc:无约束优化基本用法:x=fminunc(@fun,x0)x=fminunc(@fun,x0,options,P1,P2,...)fun.m~f(x)的m文件名x0~初始点;x~最优解P1,P2,…~传给fun的参数中间输入项缺省用[]占据位置nxRxxfMin),(模型:functiony=fun071(x,a,b)y=x(1)^2/a+x(2)^2/b;x0=[1,1];a=2;b=2;x=fminunc(@fun071,x0,[],a,b)X=(0,0)examp071.m2min122babyax其中:例控制参数设定/获取:optimset;optimgetOptimset//显示控制参数opt=optimset//控制参数设为[](即缺省值)optimsetoptfun//显示optfun的控制参数opt=optimset(@optfun)//optfun控制参数缺省值Opt=optimset('par1',val1,'par2',val2,...)Opt=optimset(oldopts,'par1',val1,...)opt=optimset(oldopts,newopts)val=optimget(opt,'par1','par2',…)val=optimget(opt,'par1','par2',…,default)Diagnostics‘on’|{‘off’}//是否显示诊断信息Display'off'|'iter'|‘final’|‘notify‘//显示信息的级别GradObj‘on’|{‘off’}//是否采用分析梯度Jacobian‘on’|{‘off’}//采用分析Jacob阵(用于约束优化中)LargeScale‘on’|{‘off’}//是否采用大规模算法MaxFunEvals最大函数调用次数MaxIter最大迭代次数TolCon约束的控制精度(用于约束优化中)TolFun函数值的控制精度TolX解的控制精度主要控制参数(对大/中规模算法均有效)最一般的输出形式[x,f,exitflag,out,grad,hess]=fminunc(...)f目标函数值exitflag0收敛,0达到函数或迭代次数,0不收敛Outputiterations实际迭代次数funcCount实际函数调用次数algorithm实际采用的算法cgiterations实际PCG迭代次数(大规模算法用)stepsize最后迭代步长(中等规模算法用)firstorderopt一阶最优条件(梯度的范数)grad目标函数的梯度hess目标函数的Hessian矩阵x0=[1,1];a=10;b=1;formatshortefopt1=optimset('Display','iter');[x,f,exitf]=fminunc(@fun071,x0,fopt1,a,b);x,f,exitfpausefopt2=optimset('TolFun',1e-8,'TolX',1e-8);[x,f,exitf,output,grad]=fminunc(@fun071,x0,fopt2,a,b);x,f,exitf,output,gradpausefopt3=optimset('TolFun',1e-1,'TolX',1e-1);[x,f,exitf,output,grad]=fminunc(@fun071,x0,fopt3,a,b);x,f,exitf,output,grad例21,10,min2221babxaxexamp072.m算法选择:LargeScale‘on’|‘off’(on为缺省)搜索步长的算法选择系统缺省采用大规模算法(如果可能)当设为‘off’时缺省:BFGS、混合2,3次多项式插值LineSearchType='quadcubic'混合2,3次多项式插值LineSearchType='cubicpoly'3次多项式插值HessUpdate=‘dfp’(DFP算法)HessUpdate=‘gillmurray’(gill-murray算法)HessUpdate=‘steepdesc’(最速下降算法)搜索方向的算法选择计算结果方向步长最优解x最优值fnBFGS2,3次(9.9997e-0019.9994e-001)1.0944e-009165DFP2,3次(9.9997e-0019.9994e-001)2.1173e-009165steep2,3次(-8.0263e-0016.5064e-001)3.2536e+0001003BFGS3次(1.0001e+0001.0003e+000)3.1432e-008162DFP3次(9.0468e-0018.1572e-001)9.8270e-003495steep3次(-1.1831e+0001.4056e+000)4.7695e+0001002222)1()(100),(min.3xxyyxf例examp073.m精确解:x=y=1,f(x,y)=0采用分析梯度nxRxxfMin),(模型:GradObj='on'x=fminunc(@fun,x0,fopt)fun.m中还要有一般形式function[f,g]=fun(x))(xf222)1()(100),(min.4xxyyxf例)(200)1(2)(40022xyxxyxf算出examp074.m方向步长最优解x最优值fnBFGS2,3次(1.0001e+0001.0002e+000)8.9857-009105DFP2,3次(1.0001e+0001.0003e+000)2.2499e-008109BFGS3次(1.0000e+0001.0001e+000)2.7164e-00953DFP3次(7.4711e-0015.5212e-001)6.7609e-002144计算结果与不用分析梯度的结果比较方向步长最优解x最优值fnBFGS2,3次(9.9997e-0019.9994e-001)1.0944e-009165DFP2,3次(9.9997e-0019.9994e-001)2.1173e-009165BFGS3次(1.0001e+0001.0003e+000)3.1432e-008162DFP3次(9.0468e-0018.1572e-001)9.8270e-003495x0*O的图形222)1()(100),(xxyyxfrosen073.m算法选择:BFGS公式,混合2,3次插值,一般较好。无约束优化:几个值得注意的问题精度控制:对迭代次数有重大影响,应适当选择。梯度函数:利用分析梯度可能改进算法的性能改变初始值由一个初值出发通常得到局部最优解,如果函数存在多个局部最优,只有改变初值,对局部最优进行比较,才有可能得到全局最优解。其他算法选择:(详细用法请查阅help文档)高度非线性、不连续时可用程序fminsearch(@fun,x0)单变量时可用程序fminbnd(@fun,v1,v2)约束线性最小二乘ubxlbbxAbxAtsdCxx,,..min221122210[x,resnorm,res,exitflag,output,lambda]=lsqlin(C,d,A1,b1,A2,b2,lb,ub,x0,options)非负最小二乘22210mindCxx[x,resnorm,res,exitf,out,lambda]=lsqnonneg(C,d,x0,options)非线性最小二乘方法)()()(minxrxrxRTx),()(xtfyxriiiTnxrxrxr))(),(()(1[x,resnorm,res,exitf,out,lambda,jacob]=lsqnonlin(@fun,x0,lb,ub,options,P1,P2,…)输入的用法与fminunc类似,但注意:fun.m~r(x)的m文件名,Jacobian=‘on’时含有导数信息function[r,J]=fun(x))(xr输出resnom=r(x)T*r(x),res=r(x)(误差向量))()()(minxrxrxRTx算法选择:缺省:大规模算法(LargeScale='on')当LargeScale='off':•缺省:Levenberg-Marquardt算法;•LevenbergMarquardt=‘off’:Gauss-Newton法一维搜索(线搜索)步长选择与fminunc中类似非线性最小二乘方法[