5.1
工程数学实验1
• 所花时间:4
• 代码行数:243
• 博客容量:1
• 代码如下:
实验一:黄金分割法(0.618法)程序设计
一、实验目的
通过程序设计掌握黄金分割法的算法。
提高计算机应用能力。
为无约束优化方法的学习和编程打下基础。
二、实验内容
1)请用0.618法求解优化问题:
的极小点和极小值(进退法确定初始区间),精度为10-6;
(2)根据0.618法算法步骤编写Matlab的程序实现0.618搜索法;
(3)要求输出内容包括:极小点、极小值、每次迭代的a、b、al、ak的值;
(4)按照模板撰写实验报告,要求规范整洁。
三、算法步骤、代码、及结果
1. 算法步骤
进退法确定初始区间步骤:
• 设定初始点 𝛼0 和初始步长 𝛾0。
• 通过迭代,逐步增大步长,确定一个包含局部极小值的区间 [𝑎,𝑏]。
• 如果目标函数值在前进方向上减小,则继续向前搜索;否则,改变搜索方向。
黄金分割法搜索极小值步骤:
• 设定初始区间 [𝑎,𝑏] 和终止精度 𝜖。
• 计算两个内部点 𝑎𝑙 和 𝑎𝑟,分别位于区间的左部和右部,利用黄金分割比 𝜏=0.618。
• 通过比较目标函数在 𝑎l 和 𝑎𝑟 的值,缩小搜索区间,更新新的区间 [𝑎,𝑏]。
• 重复以上步骤,直到区间长度小于 𝜖,输出区间的中点作为极小点。
2. 代码
进退法
%进退法求初始搜索区间,在[0,+Inf]中
function [a,b]=ForwardBackward(f,alpha0,gamma0,t,Imax)
%% 输入参数
%f:目标函数,要求单值
%alpha0:初值
%gamma0:初始步长
%t:增长倍数
%Imax:最大迭代次数
%% 输出参数
%a:区间下界
%b:区间上界
alpha_old=alpha0;
gamma=gamma0;
i=1;
while(1)
%循环里alpha_old是alpha_i,alpha是alpha_i+1
while(1)
if i>Imax
break;
end
alpha=alpha_old+gamma;
if alpha<=0%区间不能小于0
alpha=0;
break;
end
if f(alpha)>=f(alpha_old)
break;
end
gamma=t*gamma;
alpha_=alpha_old;
alpha_old=alpha;
i=i+1;
end
if i==1%如果刚开始正向就更大了,就反向搜索
gamma=-gamma;
alpha_=alpha;
i=i+1;
else
a=min([alpha_,alpha]);
b=max([alpha_,alpha]);
return
end
end
end
黄金分割法
function [alpha]=Golden_Section(f,a0,b0,epsilon)
%% 输入参数
%f:目标函数,要求单值
%a0:初始区间下界
%b0:初始区间上界
%epsilon:终止残差
%% 输出参数
%a:区间下界
%b:区间上界
a=a0;
b=b0;
tau=(sqrt(5)-1)/2;%0.618
rlostflag=2;%右侧缩减标志,赋初值
while(1)
if (b-a)<epsilon%小于终止残差,返回区间中值
alpha=(a+b)/2;
return
end
%根据上次迭代信息,可以少算一个函数值
if rlostflag==1%上次迭代是右边缩减
ar=al;
al=a+(1-tau)*(b-a);
fr=fl;
fl=f(al);
elseif rlostflag==0%上次迭代是左边缩减
al=ar;
ar=a+tau*(b-a);
fl=fr;
fr=f(ar);
elseif rlostflag==2%赋予初值
al=a+(1-tau)*(b-a);
ar=a+tau*(b-a);
fl=f(al);
fr=f(ar);
end
if fl<fr
b=ar;
rlostflag=1;
else
a=al;
rlostflag=0;
end
end
end
主程序调用:
% 定义目标函数
f = @(x) x.^2 - x + 6;
a0=0.3;
b0=0.9;
epsilon=0.0001;
[alpha]=Golden_Section(f,a0,b0,epsilon);
% 定义目标函数
f = @(x) x.^2 - x + 6;
% 使用ForwardBackward函数计算初始搜索区间
alpha0 = 1; % 初值
gamma0 = 0.1; % 初始步长
t = 2; % 增长倍数
Imax = 100; % 最大迭代次数
[a, b] = ForwardBackward(f, alpha0, gamma0, t, Imax);
% 设置终止残差
epsilon = 1e-6;
% 调用Golden_Section函数
alpha_min = Golden_Section(f, a, b, epsilon);
% 计算极小值
f_min = f(alpha_min);
% 输出结果
fprintf('极小点: %f\n', alpha_min);
fprintf('极小值: %f\n', f_min);
3. 结果
四、心得体会
通过这次实验,我在以下几个方面有了深刻的体会:
理论与实践相结合:
理论知识在实践中得到了验证,帮助我加深了对进退法和黄金分割法的理解。通过编写代码并进行实际计算,我对优化算法的工作原理和应用有了更直观的认识。这种理论与实践的结合,使得学习过程更加充实和有效。
通过实验,我的 MATLAB 编程能力有了显著提高。从函数定义到算法实现,再到调试和结果分析,每一步都需要细心和耐心。尤其是在处理循环和条件判断时,我学会了如何优化代码结构,提高代码的可读性和运行效率。此外,通过编写和调试两个主要函数,进一步提升了我对 MATLAB 编程的熟练度和信心。
实现进退法和黄金分割法的过程中,我对这两种算法的细节有了更深入的理解。例如,在进退法中,如何动态调整步长以及确定搜索方向的逻辑;在黄金分割法中,如何通过黄金比例不断缩小搜索区间。这些细节在实现过程中变得更加具体和清晰。
本次实验让我对优化算法,尤其是进退法和黄金分割法,有了更全面的了解和掌握。不仅巩固了理论知识,也提高了 MATLAB 编程技能。实验过程中,遇到的挑战和问题也让我学到了宝贵的解决问题的经验。通过这次实验,我对优化算法在实际问题中的应用有了更深刻的认识,并为今后的学习和研究奠定了坚实的基础。
浙公网安备 33010602011771号