
基于MATLAB环境下实现最优化方法.pdf
7页基于 MTLAB 环境下实现最优化方法——阻尼牛顿法1 优化设计法优化设计( Optimal Design)是现代先进的设计方法,这种设计方法是把数学规划理论与计算方法应用于实际设计中,按照预定的目标,借助计算机的运算寻求最优设计方案的有关参数,从而获得最好的技术经济效果优化设计反映出人们对于设计规律这一客观世界认识的深化设计上的“ 最优值 ” 是指一定条件影响下所能得到的最佳设计值最优值是一个相对的概念,在大多数的情况下,可以用最大值或最小值来表示概括起来,优化设计的工作包括以下两部分内容:(1)将实际的设计问题的物理模型抽象为数学模型(用数学公式来表示)建立数学模型时要选取设计变量,列出目标函数,并且给出约束条件目标函数是设计问题所需求的最优指标与设计变量之间的函数关系式2)选取适当的最优化方法,求解数学模型也可归结为在给定的条件(即约束条件)下,求出目标函数的极值或者最优值问题最优化问题的一般形式为 : min( )..f xst xX其中nxR 为决策变量,f (x)为目标函数,nXR为约束集或可行域 如果nXR,则上述问题称为无约束最优化问题,否则,称为约束最优化问题对于无约束最优化问题,也已经提出了不少数值求解方法。
例如共扼梯度法、牛顿法、Guass牛顿法、牛顿型方法、拟牛顿法、非精确牛顿法、广义拟牛顿法等2 牛顿法与阻尼牛顿法牛顿法是求解无约束优化问题最古老的算法之一但到目前为止,它的改进形式仍不失为最有效的算法之一,因为它最大的优点是收敛速度比较快由于一个函数在一点附近的性态与二次函数很接近,所以往往通过建立二次摸型来构造有效的算法,最直接而自然的二次模型,显然就是它的泰勒展开式中只到二次项的部分由此,牛顿法的基本思想是: 设已知 f (x)的极小点 x*的一个近似kx,在kx附近将 f(x)作泰勒展开有:12kkk TT kkfxqfgH其中:2,,,kkkkkk kxxffxgfxHfx若kH 正定,则kq有极小点存在,设其为k,并令1kkkxx便得到 f (x)的极小点的一个新的近似1kx,由于kq为二次凸函数,它的极小点很容易求,事实上,令0k kkqHg则有:1kk kHg当用迭代式1kkkxx时,且其中k由上式定义时,这种迭代便称为牛顿迭代,而算法称为牛顿法由牛顿法的导出过程可知, 牛顿法面临两个主要的困难 一是 Hessian矩阵kH 不正定这时二次模型不一定有极小点,甚至没有平稳点。
当kH 不定时,二次模型函数是无界的为了克服这一困难,人们提出了若干修正措施Goldstein 和 Price 提出一种修正牛顿办法:当kH 非正定时,采用最速下降方向kgGiu 和 Murray 提出了一个数值稳定的处理方法,从kH 的修改 Cholesky分解形式kg牛顿法的另一困难是,它在实际执行的过程中,每次迭代都需要精确计算Hessian矩阵的值,这就需要大量的计算,有时甚至会导致数值实验的失败后来,有人提出能否定义一种牛顿型方法来避免每次迭代都计算Hessian阵的值这样就导致了人们对经典牛顿法的修正其中阻尼牛顿法(修正牛顿法)具有一定的代表性其基本思想是:为了改变原始牛顿法定步长的搜索方式,以牛顿方向1k kH g为搜索方向进行一维最优化搜索,求该方向上的最优步长因子ka,即迭代式改为:11kkkk kxxaHg当用迭代式11kkkk kxxaHg时,这种迭代便称为阻尼牛顿迭代,而算法称为阻尼牛顿法,ka称为阻尼因子显然,阻尼牛顿法仍然保持了原始牛顿法的二次收敛性质,同时对于非二次函数又具有函数值稳定下降的特点3 MATLAB 介绍自 1994 年美国 Math Works公司推出 MATLAB 以来,目前 MATLAB 己发展成为国际上最优秀的科技应用软件之一,它以强大的科学计算与可视化功能、简单易用、开放式可扩展环境, 特别是所附带的30多种面向不同领域的工具箱支持,使得 MATLAB 在许多科学领域中成为计算机辅助设计利分析、算法研究和应用开发的基本功聚合首选平台。
MATLAB最初用于自动控制系统的辅助设计,而后采用了开放性开发的思想,不断吸收各学科领域所开发的实用程序,形成了一套规模大、覆盖面积广的工具箱,包括信号处理、工程优化、图像处理、小波分析、系统识别、通信仿真、模糊控制、神经网络、统计分析等许多现代工程技术学科的内容,它的应用范围涵盖了当今所有的工业、电子、医疗、建筑等各领域对于优化工具箱 (Optimization Toolbox),是将工程上的优化方法进行编译并设定为固定函数,使人们从繁琐的程序代码中解放出来,其丰富的函数使开发者无需重复编程,用户只需要按照要求进行调用相应函数即可,使得整个过程简单、直接本文将分别按两种方式进行编程计算案例,一种是按照牛顿法的运算法则进行编程,另一种是直接调用优化工具箱函数计算,将体现出优化工具箱极大的优势4 程序设计思路和程序模块根据牛顿法和阻尼牛顿法的计算法则,并依照Matlab 的特点,阻尼牛顿法程序设计思路一般步骤如下:(1) 根据目标函数,任意选取初始迭代点0x,给定计算精度 ε ,并初始化 k=0;(2) 判断迭代次数是否超出设定迭代次数,若超出迭代次数,则跳出迭代运算,返回迭代次数、最终迭代点和该点的函数值,并计算目标函数f(x)在点kx处的梯度kg以及kg,其中2221212,Tkknnffffffggxxxxxx;(3) 检验终止条件,若kg≤ ε 时,则说明kx是在 ε 精度下的最优值,计算并输出,kxxffx,否则转入第( 4)步;(4) 计算 f(x)在点kx的 Hessian矩阵kH ,并求其逆矩阵1 kH,2 ,1,2,,kk ijfHHxi jnx x;(5) 确定牛顿方向1kk kSHg,并沿kS方向按照 Armjijo 准则做一维沸精确线搜索,得到步长因子ka,计算:1kkkkxxaS并令 k=k+1 ,转入第( 2)步,继续运算。
按照上面的程序设计思路,阻尼牛顿法的程序模块和程序说明如下:function [x,f,k]=dampnm(fun,gfun,Hess,x0)maxk=500;% 设定最大迭代次数rho=0.55;sigma=0.4;k=0;epsilon=1e-5;%给定计算精度while(k> x0=[0 0]'; >> [x,f,k]=dampnm('fun', 'gfun', 'Hess',x0)分别在000,02,2TTxx和下程序运行结果如图一所示运用Matlab优化工具箱的 fminunc函数,可以很轻松的实现上述结果为了要调用fminunc函数,首先得编写关于 f(x)的M文件,其程序代码如下:图一初始点分别在000,02,2TTxx和下按照阻尼牛顿法编写模块程序运行的结果图二运用 Matlab 优化工具箱的fminunc 函数,调用计算结果目标函数 fx 的 M 文件:function f=myfun(x)f=100*(x(1)^2-x(2))^2+(x(1)-1)^2;函数调用计算:>> x0=[0 0]; >> [x,fval]=fminunc(@myfun,x0) fminunc 函数在00,0x下运行结果如图二所示。
6 小结优化设计的各种方法,如最速下降法、牛顿法等都需要进行大量的迭代运算,而且还要计算目标函数的梯度矩阵和海瑟矩阵,这些运算量是相当大和枯燥重复的当借助于 Matlab 软件强大的数值计算能力和卓越的数据可视化能力,通过将最优化理论与Matlab 优化工具箱或Matlab 编程结合,既大大简化了优化设计理论解题过程中繁琐的高级语言编程工作,又能节省程序调用时间,使得整个优化计算过程十分简单。
