最 优 化 方 法
学
院:
专业班级: 学生姓名: 学 号:
共轭梯度法
一. 实验目的:
(1).熟悉使用共轭梯度法求解无约束非线性规划问题的原理; (2).在掌握原理的基础上熟练运用此方法解决问题;
(3).学会利用计算机语言编写程序来辅助解决数学问题; (4).解决问题的同时分析问题,力求达到理论与实践的相统一; (5).编写规范的实验报告.
二. 实验原理:
<算法原理>:
共轭梯度法为求解线性方程组而提出。后来,人们把这种方法用于求解无约束最优化问题,使之成为一种重要的最优化方法。
共轭梯度法的基本思想是把共轭性与最速下降方法相结合,利用已知点处的梯度构造一组共轭方向,并沿这组方向进行搜索,求出目标函数的极小点。根据共轭方向的基本性质,这种方法具有二次终止性。在各种优化算法中,共轭梯度法是非常重要的一种。其优点是所需存储量小,具有步收敛性,稳定性高,而且不需要任何外来参数。 共轭方向
无约束最优化方法的核心问题是选择搜索方向.在本次实验中,我们运用基于共轭方向的一种算法—共轭梯度法
三.算法流程图:
给定初始点(0,0,0),k=1,最大迭代次数n 确定搜索方向 d 进退法确定搜索区间 分割法确定最优步长
四.实验结果:
(1).实验函数
f=(3*x1-cos(x2*x3)-1/2)^2+(x1^2-81*(x2+0.1)+sin(x3)+1.06)^2+(exp(-x1*x2)+20*x3+1/3*(10*3.14159-3))^2;
(2).源程序:
syms x1 x2 x3 r;
f=(3*x1-cos(x2*x3)-1/2)^2+(x1^2-81*(x2+0.1)+sin(x3)+1.06)^2+(exp(-x1*x2)+20*x3+1/3*(10*3.14159-3))^2;
x=[x1,x2,x3];df=jacobian(f,x);df=df.'; error=0.000001;x0=[0,0,0]';g1=subs(df,x,x0);k=0; while(norm(g1)>error) if k==0 d=-g1; else
bta=g1'*g1/(g0'*g0); d=-g1+bta*d0; end
y=subs(f,x,x0+r*d); result=jintuifa(y,r);
result2=gold(y,r,result); step=result2; x0=x0+step*d;
g0=g1;g1=subs(df,x,x0); d0=d;k=k+1;
end;
k x0
min=subs(f,[x1 x2 x3],x0) (3).实验结果 k = 26 x0 =
0.4996 -0.0900
-0.5259 min =
1.1496e-018 (4).结果分析:
由FR法得到的最优解为(0.4996, -0.0900, -0.5259),迭代的次数为32,由于精度的降低(= 1*106),实际证明对结果也有一定的影响。在本次实验中取得的最优值为1.1496e-018,而前面牛顿法迭代6次算出的最优值为8.0119e-031,效果要好了很多。所以说,收敛速度相对比较慢,应该是它的一个缺点。
五. 实验心得:
在本次试验中,主要用到的是负梯度方向的求解,还有最优步长的求解(导数求解),以及MATLAB中功能的强大,但是同时自己的操作有不是令自己很满意,在过程中屡次找不到错误所在,最后才发现都是一些细节问题,让我懂得以后在学习中要更加严谨和认真。我觉得语言这东西,平时就得多敲敲代码,多练练,自
己差错进行修改,会有一定的提高的!
最优化之牛顿法
一. 实验目的
(1).熟悉使用牛顿法求解无约束非线性规划问题的原理; (2).在掌握原理思想的基础上熟练运用此方法解决问题;
(3).学会利用计算机语言MATLAB编写程序来辅助解决数学问题; (4).解决问题的同时分析问题,力求达到理论与实践的相统一; (5).完成编写规范的实验报告.
二. 实验原理 算法思想
牛顿法是通过x(k)和在这一点的目标函数的梯度和HESSE矩阵的逆来得到后续点x(k+1),在适当的条件下,这个序列x(k)将收敛。 同样,在实验中我们取初始点(0,0,0),当
xxkk1,停止寻优,其中= 1*106。牛顿法是求解非线性方程的常用数值算法,
不仅有几何直观性,而且还有二阶收敛性。
三. 算法流程图
给定初始点(0,0,0),k=1,最大迭代次数n 通过x(k) 续点x(k+1) = 1*106 xxkk1 停止寻优
四. 实验结果 (1).实验函数
f=(3*x1-cos(x2*x3)-1/2)^2+(x1^2-81*(x2+0.1)+sin(x3)+1.06)^2+(exp(-x1*x2)+20*x3+1/3*(10*3.14159-3))^2;
(2).源程序
syms x1 x2 x3;
f=(3*x1-cos(x2*x3)-1/2)^2+(x1^2-81*(x2+0.1)+sin(x3)+1.06)^2+(exp(-x1*x2)+20*x3+1/3*(10*3.14159-3))^2; x=[x1 x2 x3];
x0=[0 0 0]';error=1e-6;t=1;m=0; while (norm(t)>error)
a=subs(diff(f,x1),x,x0);b=subs(diff(f,x2),x,x0);c=subs(diff(f,x3),x,x0); df=[a;b;c];
d=subs(diff(f,x1,2),x,x0);h=subs(diff(f,x2,2),x,x0);
l=subs(diff(f,x3,2),x,x0);e=subs((diff(diff(f,x1),x2)),x,x0);
f1=subs((diff(diff(f,x1),x3)),x,x0);g=subs((diff(diff(f,x2),x1)),x,x0); i=subs(diff(diff(f,x2),x3),x,x0);j=subs(diff(diff(f,x3),x1),x,x0); k=subs(diff(diff(f,x3),x2),x,x0); df2=[d e f1;g h i;j k l];%矩阵 df=double(df);df2=double(df2); if(det(df2)==0) break;
else
xx=x0-inv(df2)*df; end
t=xx-x0;x0=xx;m=m+1; end m x0
min=subs(f,[x1 x2 x3],x0)
(3).实验结果
x0 = 0.4996 -0.0900 -0.5259 min = 8.0119e-031
(4).结果分析:
由牛顿法求得的最优解为(0.4996,-0.0900,-0.5259),并且迭代次数为6,显然牛
顿法的收敛速度很快,最优值为8.0119e-031。但是牛顿法由于要求HESSE矩阵的逆,而计算中并不能保证HESSE矩阵总是可逆的,所以,当初始点选取一定值时,就会出现问题,比如在本次实验中取初始点为(100,100,100),就出现了问题,这也是牛顿法最主要的缺陷。同时它也不能保证每次的搜索方向为下降方向。收敛速度快,初始点要选在最优解附近。
五. 实验心得:
通过了解知道牛顿法是经典的算法,比一般优化方法的优势之处在于它是一种具有二阶敛速的算法。在合适的条件下,计算速度很快。但牛顿最优潮流的难点是如何确定起作用的不等式约束集。用牛顿法编写完成上面的程序,让我更深的体会到了算法之间的差别思想,各有所长。同时呢,我刚开始编写因为理解的不够深刻,导致算法思想的混乱,然后通过查资料,才有了更多的理解,也知道了一般情况下什么时候用牛顿法编程。
最速下降法
一. 实验目的
对所学习的最优化方法之最速下降法进行试验实践,更深层的体会该算法的编程思想,然后熟练掌握一些相关的方法,通过运用原理去操作相关的现实问题提高自己的编程能力。对题目的要求一步一步来完成,达到题目要求的系统性。做好自己的实验报告。
二. 实验原理 (1).算法思想
最速下降法,通俗点来说,就是选取一个目标函数值下降最快的方法,以利于尽快地达
到极小点。最速下降法的关键就是最速下降方向的选取,实际上我们知道负梯度方向为最速下降方向。然后我们进行一维搜索,直到满足精度要求,则停止计算。
(2).算法步骤
实验中,我们一律取初始点为(0,0,0),当搜索方向d满足d时,停止搜索,其中= 1*106。
三. 算法流程图 四.实验结果 (1).实验函数
f=(3*x1-cos(x2*x3)-1/2)^2+(x1^2-81*(x2+0.1)+sin(x3)+1.06)^2+(exp(-x1*x2)+20*x3+1/3*(10*3.14159-3))^2;
(2).源程序
syms x1 x2 x3 r;
f=(3*x1-cos(x2*x3)-1/2)^2+(x1^2-81*(x2+0.1)+sin(x3)+1.06)^2+(exp(-x1*x2)+20*x3+1/3*(10*3.14159-3))^2;
df=(jacobian(f,[x1 x2 x3])).';%对f求导
x0=[0 0 0]';error=1e-6; %取初始点为(0,0,0);允许误差为1e-6 g=subs(df,[x1 x2 x3],x0.'); g=double(g);k=0;
while(norm(g)>error)
d=-g; %确定最优搜索方向 z=subs(f,[x1 x2 x3],(x0+r*d).');
result=jintuifa(z,r); %确定搜索区间
result2=gold(z,r,result); %黄金分割法确定最优步长 step=result2(1); x0=x0+step*d;
g=subs(df,{x1 x2 x3},{x0(1,1),x0(2,1),x0(3,1)}); g=double(g); k=k+1; end; k
x0
min=subs(f,[x1 x2 x3],x0)
(3).实验结果
k = 26 x0 =
0.4996 -0.0900 -0.5259 min =
2.4829e-014
(4).结果分析:
由最速下降法求得的最优解为(0.4996,-0.0900,-0.5259),并且迭代次数为2129,最优值2.4829e-014,显然迭代的次数太多,花费的时间太多,所以效率并不高。
究其原因,应该是锯齿现象的影响。也就是说,虽然从局部看,最速下降算法是函数值下降最快的方向,但从全局看,由于锯齿现象,使得向极点移动的过程中要总弯路,因此收敛速度变慢。
五.实验心得
从整个实验来看,自己相对于上面的两个最优化方法稍有进步,一个人先搞懂算法的思
想精髓,不要盲目的去问同学,一定要自己思考。实在理解不了,然后自己通过查找资料得到一些完成实验的帮助,整体下来,感觉很好,对于出错的地方,自己把它搞清楚之外,还学到了一些其他方面的知识,综合的知识点提高了!对于每种算法的差异有体会,就是各有
所长,我觉得不能说是缺点,因为自己感觉每种算法都是用优点去解决实际的问题的。
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- igat.cn 版权所有 赣ICP备2024042791号-1
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务