174实验七生产计划中的产量问题【实验目的】1.介绍无约束最优化方法的一些基本概念。2.了解几种常见的无约束优化问题的求解方法,如迭代算法、最速下降法(梯度法)、牛顿法(Newton)、拟牛顿法。3.学习掌握用MATLAB优化工具箱中的命令来求解无约束优化问题。【实验内容】某公司生产一种产品有甲、乙两个品牌,试讨论产销平衡下的最大利润。所谓产销平衡指公司的产量等于市场上的销量。利润既取决于销量和单件价格,也依赖于产量和单件成本。按照市场规律,甲种品牌的价格1p固然会随其销量1x的增长而降低;同时乙品牌销量2x的增长也会使甲的价格有稍微下降,根据实际情况,可以确定价格与销量成线性关系,即1p=300-2.351x-0.092x乙的价格2p遵循同样的规律,有2p=480-0.141x-2.982x甲品牌的成本会随着其产量的增长而降低,按实际情况可假设为负指数关系,即有1q=381023.0xe+116乙品牌的成本2q遵循同样的规律,有2q=942018.0xe+145试确定甲、乙两种品牌的产量,使公司获得的总利润最大。【实验准备】无约束最优化方法是指在没有约束条件限制下,求多变量实值函数极值的方法。无约束最优化问题的数学表达式为min)(xf,x=(1x,2x,…,nx)nR(1)一般f为非线性函数,x是n维实变量,实际上这是一个多元函数无条件极值问题。由于一个求极大值问题,可以添加负号的方式转化为求极小值问题,因此通常只讨论求极小值问题。应该注意的是,极值问题的解,即极值点,都是局部最优解,全局最优解只能从局部最优解的比较中得到。如何求解无约束最优化问题(1)的最优解呢?一般是采用迭代方法,即先选择一个初始点,再寻找该点处的下降方向,我们称为搜索方向。在该方向上求极小点,得到一个新的点。这个新的点要优于原来的点,即新点处的目标函数值小于原来点处的目标函数值。然后在新点处再寻找下降方向和该方向上求极小点,……,如此下去,最终得到最优点。因此,求解无约束最优化问题需解决两个问题:一是在某些方向上的一维极小点,我们也称为一维搜索;另一个是寻找某些点处的下降方向,这是无约束最优化方法中最重要的一个问题。我们先了解第一个问题最常用的搜索方法。1.求一维极小的二点二次插值方法设)(kd是点)(kx处的一个搜索方向,要在该方向上寻优问题,转化为求一维函数)(=f()(kx+)(kd)(2)的求极值问题。最常用的一维搜索方法是插值法,即用某些点的函数值(或导数值)构造插值函数,用175插值函数的极小点来近似函数)(的极小点。这里介绍一种有效的插值方法,称为二点二次插值方法,即用二点处的函数值和一个点处的导数值构造二次函数,反复用二次函数的极小点来逼近函数)(的极小点。算法1二点二次插值法(1)取初始点1(如1=0),初始步长(如=1)和步长缩减因子(0,1)(如=0.1),置精度要求,并计算1=)(1,'1=)(1'(2)若'1<0,则置=;否则置=-(3)计算2=1+和2=)(2(4)如果≤1+'1(2-1),则置=2,转(3)(5)计算=1-)(2)(12'112212'1,=)(,'='()(6)若'≤,则停止计算(作为极小点);否则置1=,1=,'1=',=,转(2)2.最速下降法前面介绍了一维搜索的二点二次插值方法,下面讨论如何选择搜索方向的问题,我们先来看看两个概念。定义1称n维向量(1xf,2xf,…,nxf)T为函数)(xf在x处的梯度,记为▽)(xf▽)(xf=(1xf,2xf,…,nxf)T(3)定义2设d是任意的单位向量,若极限0limnaxfadxf)()(存在,则称该极限为函数)(xf在x处沿方向d的一阶方向导数,简称为方向导数,记为)(xfd,即)(xfd=0limnaxfadxf)()((4)最速下降法的基本思想:选取一点1x作为初始点,计算该点的梯度▽)(1xf,求该点处的最速下降方向,即令1d=-▽)(1xf,再沿1d方向前进,寻找该方向上的极小点,得到点2x,再计算▽)(2xf,令2d=-▽)(2xf,沿2d方向前进,得到点3x,如此下去……具体算法如下:算法2最速下降法(1)取初始点1x,置精度要求为,置k=1(2)若||▽)(kxf||<,则停止计算(kx为无约束问题的最优解);否则置kd=-▽)(kxf(3)一维搜索,求一维问题amin)(a=f(kkadx)得ka,置1kx=kkadx。(4)置k=k+1,转步骤(2)在算法中,为精度要求,即当梯度接近于0时,我们就认为达到极小点,终止计算。这样做的目的是避免算法产生死循环,算法中的一维搜索可用算法1来求解。最速下降法是一种最基本的算法,它在最优化方法中占有重要地位。其优点是工作量小,存储变量较少,初始点要求不高;缺点是收敛慢,效率不高,有时达不到最优解。下面介绍176一种简单而直观的方法——Newton法。3.牛顿法将)(xf的二阶导数记作▽2)(xf=(jixxf2)是一个nn矩阵,称黑塞(Hessian)矩阵(简记)(XH)。当)(xf二阶偏导数连续时,)(XH是对称矩阵。Newton法的基本思想是用一个二次函数去近似目标函数)(xf,然后精确地求出这个二次函数的极小点,并把这个极小点作为所示函数的极小点*x的近似值。设1kx是)(xf极小点*x的第1k次近似,将)(xf在kx点作二阶Taylor展开,略去高于二阶的项,用kd=kkxx1得到)(1kxf=)(kkdxf≈)(kxf+▽)(kxfkd+21d▽2)(kxfkd(5)为了求kd使)(kkdxf最小,只需将(5)式右端对kd求导,并令其为零,可得▽)(kxf+▽2)(kxfkd=0(6)称为牛顿方程。当黑塞矩阵▽2)(kxf正定时,可解得kd=-(▽2)(kxf)-1▽)(kxf(7)称为牛顿方向。其迭代公式为1kx=kx-(▽2)(kxf)-1▽)(kxf(8)4.拟牛顿法牛顿法的优点是在接近最优解时具有2阶收敛性,缺点是计算复杂,而且会出现病态、不正定等情况。为克服这些问题,同时又保持较快的收敛,利用第k和第1k步得到的kx、1kx、▽)(kxf、▽)(1kxf根据拟牛顿条件构造一正定矩阵1kG近似代替▽2)(kxf或1kH近似代替(▽2)(1kxf)-1,得到的迭代算法称为拟牛顿法。其中有两个常用的著名的迭代公式为BFGS公式和DFP公式,可参见其他最优化方法书籍或MATLAB帮助。5.MATLAB求解无约束优化问题的主要命令(1)MATLAB5.2及以下版本使用的命令x=fmin('fun',x1,x2)求一元函数y=f(x)在[x1,x2]内的极小值x=fmin('fun',x1,x2,options)同上,参数options的定义由表1给出[x,options]=fmin(...)同上,同时返回参数options的值fmin函数采用黄金分割法和抛物线插值法,fun可直接用函数表达式表示,也可以是用M文件定义的函数名。建立函数形式的M–文件格式如下,文件名fun.m(一般M函数文件名取函数名)functionf=fun(x)f=f(x)x=fmins('fun',x0)求多元函数(1)以x0为迭代初值的局部极小值x=fmins('fun',x0,options)同上,参数options的定义由表1给出[x,options]=fmins(...)同上,同时返回参数options的值fmins函数采用Nelder–Meade单纯形搜索法,fun可直接用函数表达式表示,也可以是用M文件定义的函数名。x=fminu('fun',x0)求多元函数(1)以x0为迭代初值的局部极小值x=fminu('fun',x0,options)同上,参数options的定义由表1给出[x,options]=fminu('fun',x0,...)同上,同时返回参数options的值fminu函数为无约束优化提供了三种算法,由options(6)控制,为步长一维搜索提供了二种算法,由options(7)控制。这里,fminu必须先用M–文件定义函数fun。177(2)MATLAB5.3以上版本使用的命令fminbnd替代fmin求解一元函数极值,使用格式、搜索算法与之相同,[x,Fval]=fminbnd('fun',x0,...)同时返回解x处的函数值,而不是参数options的返回值fminsearch替代fmins求解多元函数(1)极值,使用格式、搜索算法与之相同fminunc替代fminu求解多元函数(1)极值,使用格式、搜索算法与之相同有关上述命令的详细信息和使用方式可在帮助文件中了解,或在命令框里输入help“命令名”查阅。在MATLAB5.3以上的各种最新版本中fmin、fmins和fminu命令仍然有用,但在MATLAB的未来版本将可能删除这些命令。(3)命令中参数options的有关定义在大多数MATLAB优化命令函数中有一个控制参数options,它是一个有18个分量的向量,包含了在优化程序中要用到的参数,以便在计算最优值时控制精度要求、输出形式、搜索算法、迭代次数、步长等等是。在对优化命令函数的第一次调用时,向量options会自动使用缺省值;当然在调用前,可以对options的某些分量进行赋值,以达到控制要求。表1参数options各分量说明序号功能定义分量说明缺省值含义1输出形式options(1)=1,有中间结果输出options(1)=-1,给出警告信息0,无中间结果输出2解)(kx的精度options(2)设置)(kx的精度)()()1(kkkxxx≤e1-43函数)(kf的精度options(3)设置)(kf的精度)()()1(kkkfff≤e1-44函数)(kg的精度options(4)设置)(kg的精度,由命令constr、minmax使用终止判据)()()1(kkkggg≤e1-75主要算法options(5)=1,高斯–牛顿法0,LM方法6搜索方向算法options(6)=1,拟牛顿法DFP公式options(6)=2,最速下降法0,拟牛顿法的BFGS公式7步长一维搜索算法options(7)=1,三次多项式插值0,混合的二次和三次多项式8函数值输出options(8)输出极值点处的函数值9梯度检查options(9)=1,最初几步,梯度将与有限微分计算的结果比较0,不作检查10函数计算次数option(10)输出函数计算次数11梯度计算次数option(11)输出梯度计算次数12约束梯度计算次数option(12)输出约束梯度计算次数13等式约束的个数option(13)确定等式约束数目0,等式约束个数为014最大迭代次数option(14)输入迭代的最大次数100n,n为自变量个数200n(fmins)500n(fmin)15目标优化由attgoal命令使用,option(15)输入须达目的的目标个数016差分步长最小值用差分计算梯度时步长的下限e1-817差分步长最大值用差分计算梯度时步长的上限0.118步长步长参数,一般取1或更小【实验方法与步骤】1.MATLAB优化工具箱中解无约束问题的命令和参数options的基本用法下面用例题来予以说明例1求解min)(xf=xe-5x,1≤x≤2178输入命令:x=fmin('exp(x)-5*x',1,2),f=exp(x)-5*xx=1.6094f=-3.0472同时,该问题可以用fminbnd求解,得到的解答一样输入命令:[x,fval]=fminbnd('exp(x)-5*x',1,2)x=1.6094fval=-3.0472例2用拟牛顿法的DFP公式求解min)(xf=214x+22x-231xx,初值为(1,2),要求精度为