1、最优化方法Matlab实现第九章 最优化方法的Matlab实现在生活和工作中,人们对于同一个问题往往会提出多个解决方案,并通过各方面的论证从中提取最佳方案。最优化方法就是专门研究如何从多个方案中科学合理地提取出最佳方案的科学。由于优化问题无所不在,目前最优化方法的应用和研究已经深入到了生产和科研的各个领域,如土木工程、机械工程、化学工程、运输调度、生产控制、经济规划、经济管理等,并取得了显著的经济效益和社会效益。用最优化方法解决最优化问题的技术称为最优化技术,它包含两个方面的内容:1)建立数学模型 即用数学语言来描述最优化问题。模型中的数学关系式反映了最优化问题所要达到的目标和各种约束条件。2
2、)数学求解 数学模型建好以后,选择合理的最优化方法进行求解。最优化方法的发展很快,现在已经包含有多个分支,如线性规划、整数规划、非线性规划、动态规划、多目标规划等。9.1 概 述 利用Matlab的优化工具箱,可以求解线性规划、非线性规划和多目标规划问题。具体而言,包括线性、非线性最小化,最大最小化,二次规划,半无限问题,线性、非线性方程组)的求解,线性、非线性的最小二乘问题。另外,该工具箱还提供了线性、非线性最小化,方程求解,曲线拟合,二次规划等问题中大型课题的求解方法,为优化方法在工程中的实际应用提供了更方便快捷的途径。9.1.1 优化工具箱中的函数 优化工具箱中的函数包括下面几类: 1最
3、小化函数表9-1 最小化函数表函 数描 述fgoalattain多目标达到问题fminbnd有边界的标量非线性最小化fmincon有约束的非线性最小化fminimax最大最小化fminsearch, fminunc无约束非线性最小化fseminf半无限问题linprog线性规划quadprog二次规划2方程求解函数表9-2 方程求解函数表函 数描 述线性方程求解fsolve非线性方程求解fzero标量非线性方程求解3最小二乘val = optimget(options,param,default描述:val = optimget(options,param 返回优化参数options中指定的参
4、数的值。只需要用参数开头的字母来定义参数就行了。val = optimget(options,param,default 若options结构参数中没有定义指定参数,则返回缺省值。注意,这种形式的函数主要用于其它优化函数。举例:1下面的命令行将显示优化参数options返回到my_options结构中:val = optimget(my_options,Display2下面的命令行返回显示优化参数options到my_options结构中。参见:optimsetoptimset函数功能:创建或编辑优化选项参数结构。语法:options = optimset(param1,value1,para
5、m2,value2,.optimsetoptions = optimsetoptions = optimset(optimfunoptions = optimset(oldopts,param1,value1,.options = optimset(oldopts,newopts描述:options = optimset(param1,value1,param2,value2,. 创建一个称为options的优化选项参数,其中指定的参数具有指定值。所有未指定的参数都设置为空矩阵 创建一个选项结构options,其中所有的元素被设置为。options = optimset(optimfun 创建
6、一个含有所有参数名和与优化函数optimfun相关的缺省值的选项结构options。options = optimset(oldopts,param1,value1,. 创建一个oldopts的拷贝,用指定的数值修改参数。options = optimset(oldopts,newopts 将已经存在的选项结构oldopts与新的选项结构newopts进行合并。newopts参数中的所有元素将覆盖oldopts参数中的所有对应元素。举例: 1下面的语句创建一个称为options的优化选项结构,其中显示参数设为iter,TolFun参数设置为1e-8:options = optimset(Dis
7、play,iter,TolFun,1e-8 2下面的语句创建一个称为options的优化结构的拷贝,改变TolX参数的值,将新值保存到optnew参数中:optnew = optimset(options,TolX,1e-4。 3下面的语句返回options优化结构,其中包含所有的参数名和与fminbnd函数相关的缺省值:options = optimset(fminbnd 4若只希望看到fminbnd函数的缺省值,只需要简单地键入下面的语句就行了:optimset fminbnd 或者输入下面的命令,其效果与上面的相同:optimset(fminbnd参见:optimget9.1.4 模型输
8、入时需要注意的问题使用优化工具箱时,由于优化函数要求目标函数和约束条件满足一定的格式,所以需要用户在进行模型输入时注意以下几个问题:1.目标函数最小化优化函数fminbnd、fminsearch、fminunc、fmincon、fgoalattain、fminmax和lsqnonlin都要求目标函数最小化,如果优化问题要求目标函数最大化,可以通过使该目标函数的负值最小化即-f(x最小化来实现。近似地,对于quadprog函数提供-H和-f,对于linprog函数提供-f。2.约束非正优化工具箱要求非线性不等式约束的形式为Ci(x0,通过对不等式取负可以达到使大于零的约束形式变为小于零的不等式约
9、束形式的目的,如Ci(x0形式的约束等价于- Ci(x0;Ci(xb形式的约束等价于- Ci(x+b0。3.避免使用全局变量9.1.5 x = 0.63709.2 最小化问题9.2.1 单变量最小化9.2.1.1 基本数学原理本节讨论只有一个变量时的最小化问题,即一维搜索问题。该问题在某些情况下可以直接用于求解实际问题,但大多数情况下它是作为多变量最优化方法的基础在应用,因为进行多变量最优化要用到一维搜索法。该问题的数学模型为: 其中,x,x1,和x2为标量,f(x为函数,返回标量。该问题的搜索过程可用下式表达:其中xk为本次迭代的值,d为搜索方向,为搜索方向上的步长参数。所以一维搜索就是要利
10、用本次迭代的信息来构造下次迭代的条件。求解单变量最优化问题的方法有很多种,根据目标函数是否需要求导,可以分为两类,即直接法和间接法。直接法不需要对目标函数进行求导,而间接法则需要用到目标函数的导数。1直接法常用的一维直接法主要有消去法和近似法两种。黄金分割法的基本思想是在单峰区间内适当插入两点,将区间分为三段,然后通过比较这两点函数值的大小来确定是删去最左段还是最右段,或同时删去左右两段保留中间段。重复该过程使区间无限缩小。插入点的位置放在区间的黄金分割点及其对称点上,所以该法称为黄金分割法。该法的优点是算法简单,效率较高,稳定性好。,用它逼近函数f(x,以P3(x的极小点作为f(x的近似极小
11、点。一般讲,三次插值法比二次插值法的收敛速度要快些,但每次迭代需要计算两个导数值。三次插值法的迭代公式为其中 如果函数的导数容易求得,一般来说首先考虑使用三次插值法,因为它具有较高的效率。对于只需要计算函数值的方法中,二次插值法是一个很好的方法,它的收敛速度较快,尤其在极小点所在区间较小时尤其如此。黄金分割法则是一种十分稳定的方法,并且计算简单。由于以上原因,Matlab优化工具箱中使用得较多的方法是二次插值法、三次插值法、二次、三次混合插值法和黄金分割法。9.2.1.2 相关函数介绍fminbnd功能:找到固定区间内单变量函数的最小值。语法:x = fminbnd(fun,x1,x2x =
12、fminbnd(fun,x1,x2,optionsx = fminbnd(fun,x1,x2,options,P1,P2,.x,fval = fminbnd(.x,fval,exitflag = fminbnd(.x,fval,exitflag,output = fminbnd(.描述:fminbnd求取固定区间内单变量函数的最小值。x = fminbnd(fun,x1,x2返回区间x1,x2上fun参数描述的标量函数的最小值x。x = fminbnd(fun,x1,x2,options用options参数指定的优化参数进行最小化。x = fminbnd(fun,x1,x2,options,P
13、1,P2,.提供另外的参数P1,P2等,传输给目标函数fun。如果没有设置options选项,则令options=。x,fval = fminbnd(.返回解x处目标函数的值。x,fval,exitflag = fminbnd(.返回exitflag值描述fminbnd函数的退出条件。x,fval,exitflag,output = fminbnd(.返回包含优化信息的结构输出。变量:函数的输入变量在表9-7中进行描述,输出变量在表9-8中描述。与fminbnd函数相关的细节内容包含在fun,options,exitflag和output等参数中,如表9-10所示。表9-10 参数描述表参 数
14、描 述fun需要最小化的目标函数。fun函数需要输入标量参数x,返回x处的目标函数标量值f。可以将fun函数指定为命令行,如x = fminbnd(inline(sin(x*x,x0同样,fun参数可以是一个包含函数名的字符串。对应的函数可以是M文件、内部函数或MEX文件。若fun=myfun,则M文件函数myfun.m必须右下面的形式。function f = myfun(xf = . %计算x处的函数值。options优化参数选项。你可以用optimset函数设置或改变这些参数的值。options参数有以下几个选项:Display 显示的水平。选择off,不显示输出;选择iter,显示每一
15、步迭代过程 的输出;选择final,显示最终结果。MaxFunEvals 函数评价的最大允许次数。MaxIter 最大允许迭代次数。TolX x处的终止容限。exitflag描述退出条件:0 表示目标函数收敛于解x处。0 表示已经达到函数评价或迭代的最大次数。0 表示目标函数不收敛。output该参数包含下列优化信息:output.iterations 迭代次数。output.algorithm 所采用的算法。output.funcCount 函数评价次数。算法:fminbnd是一个M文件。其算法基于黄金分割法和二次插值法。文献1中给出了实现同样算法的Fortran程序。局限性:1目标函数必须
16、是连续的。2fminbnd函数可能只给出局部最优解。3当问题的解位于区间边界上时,fminbnd函数的收敛速度常常很慢。此时,fmincon函数的计算速度更快,计算精度更高。4fminbnd函数只用于实数变量。参见:fminsearch, fmincon, fminunc, optimset, inline文献:1Forsythe, G.E., M.A. Malcolm, and C.B. Moler, Computer Methods for Mathematical Computations, Prentice Hall, 1976.9.2.1.3 应用实例例一在区间的最小值:x = fm
17、inbnd(sin,0,2*pix = 4.7124所以区间的最小值点位于x=4.7124处。最小值处的函数值为:y = sin(xy = -1.0000 磁盘中该问题的M文件名为opt21_1.m。例三对边长为3m的正方形铁板,在四个角处剪去相等的正方形以制成方形无盖水槽,问如何剪法使水槽的容积最大? 假设剪去的正方形的边长为x,则水槽的容积为现在要求在区间f = -(3-2*x.2 * x。然后调用fminbnd函数(磁盘中M文件名为opt21_3.m:x = fminbnd(opt21_3o,0,1.5得到问题的解:x =0.5000即剪掉的正方形的边长为0.5m时水槽的容积最大。水槽的
18、最大容积计算:y = optim2(xy =-2.0000 所以水槽的最大容积为2.0000m3。9.2.2 线性规划9.2.2.1 基本数学原理线性规划是处理线性目标函数和线性约束的一种较为成熟的方法,目前已经广泛应用于军事、经济、工业、农业、教育、商业和社会科学等许多方面。线性规划问题的标准形式是:或写成矩阵形式为:其中,0为n维列向量。线性规划的标准形式要求目标函数最小化,约束条件取等式,变量非负。不符合这几个条件的线性模型要首先转化成标准形。线性规划的求解方法主要是单纯形法(初始顶点,将它作为迭代过程的出发点,其目标值为z(x(0。2寻找一个基本可行解x(1,使z(x(1z(x(0。方
19、法是通过消去法将产生x(0的典范形式化为产生x(1的典范形式。3继续寻找较好的基本可行解x(2,x(3,使目标函数值不断改进,即z(x(1z(x(2z(x(3。当某个基本可行解再也不能被其它基本可行解改进时,它就是所求的最优解。Matlab优化工具箱中采用的是投影法,它是单纯形法的一种变种。9.2.2.2 相关函数介绍linprog函数功能:求解线性规划问题。数学模型:其中f,x,b,beq,lb和ub为向量,A和Aeq为矩阵。语法:x = linprog(f,A,b,Aeq,beqx = linprog(f,A,b,Aeq,beq,lb,ubx = linprog(f,A,b,Aeq,beq
20、,lb,ub,x0x = linprog(f,A,b,Aeq,beq,lb,ub,x0,optionsx,fval = linprog(.x,fval,exitflag = linprog(.x,fval,exitflag,output = linprog(.x,fval,exitflag,output,lambda = linprog(.描述:x = linprog(f,A,b求解问题 min f*x,约束条件为A*x 求解上面的问题,但增加等式约束,即Aeq*x = beq。若没有不等式存在,则令A=、b=。x = linprog(f,A,b,Aeq,beq,lb,ub定义设计变量x的下界
21、lb和上界ub,使得x始终在该范围内。若没有等式约束,令Aeq=、beq=。x = linprog(f,A,b,Aeq,beq,lb,ub,x0设置初值为x0。该选项只适用于中型问题,缺省时大型算法将忽略初值。x = linprog(f,A,b,Aeq,beq,lb,ub,x0,options用options指定的优化参数进行最小化。x,fval = linprog(. 返回解x处的目标函数值fval。x,lambda,exitflag = linprog(.返回exitflag值,描述函数计算的退出条件。x,lambda,exitflag,output = linprog(. 返回包含优化信
22、息的输出变量output。x,fval,exitflag,output,lambda = linprog(. 将解x处的拉格朗日乘子返回到lambda参数中。变量:lambda参数lambda参数是解x处的拉格朗日乘子。它有以下一些属性:lambda.lower lambda的下界。lambda.upper lambda的上界。lambda.ineqlin lambda的线性不等式。lambda.eqlin lambda的线性等式。其它参数意义同前。算法:大型优化算法大型优化算法采用的是LIPSOL法,该法在进行迭代计算之前首先要进行一系列的预处理。中型优化算法 linprog函数使用的是投影
23、法,就象quadprog函数的算法一样。linprog函数使用的是一种活动集方法,是线性规划中单纯形法的变种。它通过求解另一个线性规划问题来找到初始可行解。诊断:大型优化问题算法的第一步涉及到一些约束条件的预处理问题。有些问题可能导致linprog函数退出,并显示不可行的信息。在本例中,exitflag参数将被设为负值以表示优化失败。若Aeq参数中某行的所有元素都为零,但Beq参数中对应的元素不为零,则显示以下退出信息:Exiting due to infeasibility: an all zero row in the constraint matrix does not have a z
24、ero in corresponding right hand size entry.若x的某一个元素没在界内,则给出以下退出信息: Exiting due to infeasibility: objective f*x is unbounded below.若Aeq参数的某一行中只有一个非零值,则x中的相关值称为奇异变量。这里,x中该成分的值可以用Aeq和Beq算得。若算得的值与另一个约束条件相矛盾,则给出以下退出信息:Exiting due to infeasibility: Singleton variables in equality constraints are not feasible.若奇
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1