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 编程技能。实验过程中,遇到的挑战和问题也让我学到了宝贵的解决问题的经验。通过这次实验,我对优化算法在实际问题中的应用有了更深刻的认识,并为今后的学习和研究奠定了坚实的基础。
 

posted @ 2024-05-01 20:19  aallofitisst  阅读(15)  评论(0)    收藏  举报