2024/5/24
所花时间:3小时
代码行:160行
博客量:1篇
了解到的知识点:
实验一:黄金分割法(0.618法)程序设计
一、实验目的
通过一维寻优黄金分割法的程序设计,培养学生计算机的应用能力,并为今后无约束优化方法的学习和编程,奠定基础;掌握缩小寻优区间的黄金分割法。
二、实验内容
(1)请用0.618法求解优化问题:
的极小点和极小值(进退法确定初始区间),精度为10-6;
(2)根据0.618法算法步骤编写Matlab的程序实现0.618搜索法;
(3)要求输出内容包括:极小点、极小值、每次迭代的a、b、al、ak的值;
三、算法步骤、代码、及结果
1. 算法步骤
1.初始化:给定一个目标函数 f(x),以及搜索区间 [a, b],其中 a 和 b 分别为搜索区间的左右边界,满足 a < b。
2.计算两个内点:根据搜索区间 [a, b],计算两个内点 c 和 d,其中 c = b - 0.618 * (b - a),d = a + 0.618 * (b - a)。
3.比较函数值:计算 f(c) 和 f(d),并比较它们的大小。
4.缩小搜索区间:根据比较结果,更新搜索区间 [a, b]。如果 f(c) < f(d),则将搜索区间缩小为 [a, d];如果 f(c) > f(d),则将搜索区间缩小为 [c, b]。
5.重复迭代:重复执行步骤 2、3 和 4,直到满足停止条件(例如,搜索区间足够小或者迭代次数达到设定值)为止。
6.输出结果:最终输出搜索区间的中点作为优化结果,即 x* = (a + b) / 2。
2. 代码
function [s,phis,k,G,E]=gold(phi,a,b,delta,epsilon)
t=(sqrt(5)-1)/2;
h=b-a;
phia=feval(phi,a);phib=feval(phi,b);
p=a+(1-t)*h;%左试探点
q=a+t*h;%右试探点
phip=feval(phi,p);
phiq=feval(phi,q);
k=1;
G(k,:)=[a,b,p,q];
while(h>delta)
if(phip<phiq)
b=q;
phib=phiq;
q=p;
phiq=phip;
h=b-a;
p=a+(1-t)*h;
phip=feval(phi,p);
else
a=p;
phia=phip;
p=q;
phip=phiq;
h=b-a;
q=a+t*h;
phiq=feval(phi,q);
end
k=k+1;
G(k,:)=[a,b,p,q];
end
ds=abs(b-a);dphi=abs(phib-phia);
if(phip<=phiq)
s=p;phis=phip;
else
s=q;phis=phiq;
end
E=[ds,dphi];
3. 结果
[s,phis,k,G,E]=gold(inline(f),a,b,delta,epsilon)
s =
0.6525
phis =
0.6673
k =
6
G =
0 2.0000 0.7639 1.2361
0 1.2361 0.4721 0.7639
0.4721 1.2361 0.7639 0.9443
0.4721 0.9443 0.6525 0.7639
0.4721 0.7639 0.5836 0.6525
0.5836 0.7639 0.6525 0.6950
E =
0.1803 0.0077
四.心得体会
在本次实验中,我学习了一维寻优黄金分割法的程序设计,这对于培养我的计算机应用能力是非常有帮助的。通过这次实验,我不仅学会了如何编写黄金分割法的程序,还掌握了如何缩小寻优区间来提高算法的效率。在实验过程中,我发现黄金分割法是一种简单而有效的优化算法,通过不断缩小搜索范围,可以快速找到最优解。我首先定义了一个目标函数,并设置了初始的搜索区间。然后根据黄金分割法的原理,不断更新搜索区间,直到满足停止条件为止。通过实验,我发现黄金分割法在寻优过程中具有很好的收敛性,能够快速找到最优解。而且,通过不断调整搜索区间的大小,可以进一步提高算法的效率。