用MATLAB实现共轭梯度法求解实例
用MATLAB 实现共轭梯度法求解实例
康福 1
一.无约束优化方法
1.1 无约束优化方法的必要性
一般机械优化设计问题,都是在一定的限制条件下追求某一指标为最小,它
们都属于约束优化问题。但是为什么要研究无约束优化问题?
(1)有些实际问题,其数学模型本身就是一个无约束优化问题。
(2)通过熟悉它的解法可以为研究约束优化问题打下良好的基础。
(3)约束优化问题的求解可以通过一系列无约束优化方法来达到。所以无约束优
化问题的解法是优化设计方法的基本组成部分,也是优化方法的基础。
(4)对于多维无约束问题来说,古典极值理论中令一阶导数为零,但要求二阶可
微,且要判断海赛矩阵为正定才能求得极小点,这种方法有理论意义,但无
实用价值。和一维问题一样,若多元函数F(X)不可微,亦无法求解。但古典
极值理论是无约束优化方法发展的基础。
1.2共轭梯度法
目前已研究出很多种无约束优化方法,它们的主要不同点在于构造搜索方向
上的差别。
(1)间接法——要使用导数,如梯度法、(阻尼)牛顿法、变尺度法、共轭梯度
法等。
(2)直接法——不使用导数信息,如坐标轮换法、鲍威尔法单纯形法等。
用直接法寻找极小点时,不必求函数的导数,只要计算目标函数值。这类方
法较适用于解决变量个数较少的(n ≤20)问题,一般情况下比间接法效率低。间接法除要计算目标函数值外,还要计算目标函数的梯度,有的还要计算其海赛矩阵。 搜索方向的构成问题乃是无约束优化方法的关键。
共轭梯度法是沿着共轭方向进行搜索,属于共轭方向法中的一种,该方法中
每一个共轭向量都是依赖于迭代点处的负梯度而构造出来。共轭梯度法作为一种实用的迭代法,它主要有下面的优点:
(1)算法中,系数矩阵A的作用仅仅是用来由已知向量P 产生向量W=AP ,这不仅
可充分利用A的稀疏性,而且对某些提供矩阵A较为困难而由已知向量P 产
生向量W=AP 又十分方便的应用问题是很有益的。
(2)不需要预先估计任何参数就可以计算,这一点不像SOR 等;
(3)每次迭代所需的计算,主要是向量之间的运算,便于并行化。
共轭梯度法原理的知识较多,请详见《机械优化设计》第四章的第四、五节。
图1为共轭梯度法的程度框图 1(0,1,2,)
k k k k s k α+=+=x x
图1为共轭梯度法的程度框图
二.设计题目及要求
2.1设计题目
用共轭梯度法求二次函数
221212
112(,)242f x x x x x x x =+--
的极小点及极小值。 2.2设计要求
(1)使用matlab 编写程序,熟练撑握matlab 编程方法。
(2)学习并撑握共轭梯度法的原理、方法及应用,并了解不同无约束优化方法的
区别、优缺点及特殊要求。
(3)编写程序,计算出二次函数的极小点及极小值,并适当选取不同的初始点及
迭代精度精度,分析比较结果。
三.计算步骤
3.1计算求解
解:已知初始点[1,1]T 迭代精度 0.001ε=
1)第一次沿负梯度方向搜寻
计算初始点处的梯度:
为一维搜索最佳步长,应满足
得:
2)第二次迭代
代入目标函数
由 得
从而有: 因
收敛。
0120212244()422x x f x x ---?????==????-??
??x x 010000014141212αααα+??????=+=+=??????--??????x x d 1002()min ()min(40203)f f αα
ααα=+=--x x d 00.25α=120.5??=????x 11()2f -???=??-??x 21200()50.2520()
f f β?===?x x 11002() 1.5f β??=-?+=????d x d 21122220.5 1.50.5 1.5αααα+??????=+=+=??????+??????x x d 22()(22)2(0.5 1.5)2(22)(0.5 1.5)4(22)()f x αααααφα=+++-++-+=()0φα'=1α=22240,()8,()20f f ????==-?=????????
x x x 2()0f ε?= 3.2运行与程序 运行:打开matlab,确定conjugate_grad_2d.m文件夹为当前目录。 在命令窗中输入:f=conjugate_grad_2d([1,1],0.001) 选择不同的初始点坐标[0,0],[0,1],[1,0],和迭代精度0.01,0.0001, 进行运行时,需要多次调用conjugate_grad_2d函数。 程序及说明: function f=conjugate_grad_2d(x0,t) %用共轭梯度法求已知函数f(x1,x2)=x1^2+2*x2^2-4*x1-2*x1*x2的极值点 %已知初始点坐标:x0 %已知收敛精度:t %求得已知函数的极值:f x=x0; syms xi yi a; %定义自变量,步长为符号变量 f=xi^2+2*yi^2-4*xi-2*xi*yi; %创建符号表达式f fx=diff(f,xi); %求表达式f对xi的一阶求导 fy=diff(f,yi); %求表达式f对yi的一阶求导 fx=subs(fx,{xi,yi},x0); %代入初始点坐标计算对xi的一阶求导实值 fy=subs(fy,{xi,yi},x0); %代入初始点坐标计算对yi的一阶求导实值 fi=[fx,fy]; %初始点梯度向量 count=0; %搜索次数初始为0 while double(sqrt(fx^2+fy^2))>t %搜索精度不满足已知条件 s=-fi; %第一次搜索的方向为负梯度方向 if count<=0 s=-fi; else s=s1; end x=x+a*s; %进行一次搜索后的点坐标 f=subs(f,{xi,yi},x); %构造一元搜索的一元函数φ(a) f1=diff(f); %对函数φ(a)进行求导 f1=solve(f1); %得到最佳步长a if f1~=0 ai=double(f1); %强制转换数据类型为双精度数值 else break %若a=0,则直接跳出循环,此点即为极值点 end x=subs(x,a,ai); %得到一次搜索后的点坐标值 f=xi^2+2*yi^2-4*xi-2*xi*yi; fxi=diff(f,xi); fyi=diff(f,yi); fxi=subs(fxi,{xi,yi},x); fyi=subs(fyi,{xi,yi},x); fii=[fxi,fyi]; %下一点梯度向量 d=(fxi^2+fyi^2)/(fx^2+fy^2); s1=-fii+d*s; %下一点搜索的方向向量 count=count+1; %搜索次数加1 fx=fxi; fy=fyi; %搜索后终点坐标变为下一次搜索的始点坐标 end x,f=subs(f,{xi,yi},x),count %输出极值点,极小值以及搜索次数 四.运行结果及分析 此程序运行2秒后终止,结果如下: x = 4 2 极小点坐标 f = -8 极小值数值 count = 2 迭代次数 ans = -8 分析可得: (1)由结果看出,程序经过2次迭代,得到二次函数的极小值坐标[4,2],极小值 -8;表明共轭梯度法收敛速度较快,计算量较小,稳定性高。 (2)选择不同的初始点坐标[0,0],[0,1],[1,0],[1,1],都是经过2次迭代得到一 致的结果;表明共轭梯度法初始点的选择不影响收敛结果。 (3)选择迭代精度0.0001,程序将近运行15秒才结束;可知迭代精度越高时,程 序运行的时候越长,所以在实际应用中选择适当的迭代精度,有利于提高计 算的效率。 (4)从共轭梯度法的计算过程可以看出,第一个搜索方向取作负梯度方向,这就 是最速下降法。其余各步的搜索方向是将负梯度偏转一个角度,也就是对负 梯度进行修正。所以共轭梯度法实质上是对最速下降法进行的一种改进,故 它又被称作旋转梯度法。 五.结束语 优化设计是是机械行业发展起来的一门新学科,将最优化原理和计算机应用于设计领域,为工程设计提供一种重要的科学设计方法。利用它,人们可以从众多的设计方案中寻找最佳设计方案,从而大大提高设计效率和质量,广泛应用于各个工业部门。 在自然科学和工程技术中很多问题的解决常常归结为约束优化或无约束优化的问题。首先根据实际的机械问题建立相应的数学模型,即应用数学形式描述实际设计问题。同时需要用专业的知识确定设计的限制条件和所追求的目标,确立各设计变量之间的相互关系等。一旦建立数学模型,应用数学规划理论的方法,根据数学模型的特点可以选择适当的优化方法,进而可以选择适当的计算机程序,以计算作为工具求得最佳优化设计参数。通过学习发现,共轭梯度法是介于最速下降法与牛顿法之间的一个方法,它仅需利用一阶导数信息,但克服了最速下降法收敛慢的缺点,又避免了牛顿法需要存储和计算Hesse矩阵并求逆的缺点,共轭梯度法不仅是解决大型线性方程组最有用的方法之一,也是解大型非线性最优化最有效的算法 之一。其优点是所需存储量小,具有步收敛性,稳定性高,而且不需要任何外来参数。如何把实际的工程技术问题转化为理论的数学模型,进行分析运算求解,是检验我们是否学好这一课的关键。这可以让我们在以后的研究生生涯中有更加透彻的理解能力,扎实地撑握机械知识,培养创造性思维,专业技能有新的提高。 通过这次作业的完成,越来越觉得数学方法在机械优化设计中的重要性。无论是优化设计,CAD,CAE,其理论支撑都是来自高等数学、数值分析、矩阵分析这几门课程,这让我对原本枯燥无味的数学课程,又有了新的态度,新的激情。认真学习好数学,理论联系实践,同时借助于强大的计算机工具,解决实际问题。 Matlab是一种强大的科学计算工具,为科学研究、工程设计以及必须进行有效数值计算的众多科学领域提供了一种有力的工具。在使用Matlab编写程序时,对于编程的基本规则及函数的调用缺乏清晰的认识,程序运行中经常出现错误,一点一滴地调试再纠正。比如:程序运行过程中经常出现错误:Error using ==>Too many input arguments。查阅了些书籍,上网求助,最后查明原因是自定义的M 文件名称与Matlab部函数名相似,导致无法运行。浪费了大量的时间与精力,庆幸的是,经过自己的努力,纠正错误,按时完成了作业。研究生培养过程中,必须系统地学习编程软件,达到精通熟练的程度,并能够自主开发一些小程序,我相信在以后学习工作中它会提供更大的帮助。 参考文献: [1] 靖民,工业大学.机械优化设计.:机械工业,2006.