最优化算法实验报告.docx
文本预览下载声明
基于Matlab的共轭梯度算法指导老师:姓 名:学 号:班 级:日 期:基于Matlab的共轭梯度算法实验目的及要求熟悉使用共轭梯度法求解无约束非线性规划问题的原理;在掌握原理的基础上熟练运用此方法解决问题学会利用计算机语言编写程序来辅助解决数学问题;解决问题的同时分析问题,力求达到理论与实践的统一; 编写规范的实验报告.实验内容实验原理1.基本思想:把共轭性与最速下降方法相结合,利用已知点处的梯度构造一组共轭方向,并沿这组方向进行搜索,求出目标函数的极小点。根据共轭方向的基本性质,这种方法具有二次终止性。在各种优化算法中,共轭梯度法是非常重要的一种。其优点是所需存储量小,具有步收敛性,稳定性高,而且不需要任何外来参数。程序流图:三、实验代码通过查阅相关资料,编写一个基于Matlab的共轭梯度算法,具体代码如下:function f=grad_2d(x0,t) %用共轭梯度法求已知函数f(x1,x2)=x1^2+2*x2^2-4*x1-2*x1*x2的极值点%已知初始点坐标:x0%已知收敛精度:t %求得已知函数的极值:fx=x0; syms xi yi a; %定义自变量,步长为符号变量f=xi^2+2*yi^2-4*yi-2*xi*yi; %创建符号表达式ffx=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; %搜索后终点坐标变为下一次搜索的始点坐标endx,f=subs(f,{xi,yi},x),count %输出极值点,极小值以及搜索次数end四、实验结果在命令窗口输入:f=grad_2d([1,1],0.0000001)输出结果如下:x =4.0000 2.0000f =-8.0000count = 75f =-8.0000当在命令窗口输入如下命令时:f=grad_2d([2,1],0.0000001)x =4.0000 2.0000f =-8.0000count =22f =-8.0000当在命令窗口输入如下命令时:f=grad_2d([2,1],0.001)x = 3.9996 1.9999f =-8.0000count =12f =-8.0000由以上结果可知: (1.)初始点不同搜索次数不同 (2.)无论初始点为多少,精度相同时最终结果极值点都是(4.0000,2.0000) (3.)当初始点相同时,若精度不一样搜索次数和最终结果会有差异但大致相同。五、总结从共轭梯度法的计算过程可以看出,第一个搜索方向取作负梯度方向,这就 是最速下降法。其余各步的搜索方向是将负梯度偏转一个角度,也就是对负梯度进行修正。所以共轭梯度法实质上是对最速下降法
显示全部