2024.6.2

实验一:黄金分割法(0.618法)程序设计

一、实验目的

通过一维寻优黄金分割法的程序设计,培养学生计算机的应用能力,并为今后无约束优化方法的学习和编程,奠定基础;掌握缩小寻优区间的黄金分割法。

二、实验内容

(1)请用0.618法求解优化问题:

 

的极小点和极小值(进退法确定初始区间),精度为10-6

(2)根据0.618法算法步骤编写Matlab的程序实现0.618搜索法;

(3)要求输出内容包括:极小点、极小值、每次迭代的abalak的值;

三、算法步骤、代码、及结果

1. 算法步骤

  1.    进退法确定初始区间:通过观察函数的性质或者初步的试探,确定一个包含极小点的初始搜索区间 [a, b]。
  2. 初始化:设定精度为 epsilon = 10^-6,以及常数 r = 0.618。
  3. 计算初始搜索点:计算初始搜索点 al = a + (1 - r) * (b - a) 和 ak = a + r * (b - a) 对应的函数值 fal 和 fak。
  4. 迭代
  • 4.1 如果搜索区间的长度小于精度 epsilon,则停止迭代,输出当前搜索区间的中点作为极小点,以及该点对应的函数值作为极小值。
  • 4.2 否则,比较 fal 和 fak:
    • 如果 fal < fak,则更新搜索区间为 [a, ak, b],即丢弃区间 [ak, b];
    • 如果 fal > fak,则更新搜索区间为 [al, a, b],即丢弃区间 [a, al];
    • 4.3 重新计算新的搜索点 al 和 ak,以及对应的函数值 fal 和 fak。
    • 4.4 重复步骤4。

 

2. 代码

       function [xmin, fmin, iter_info] = golds(a, b, epsilon)

    r = 0.618;  % Golden ratio

   

    iter_info = struct('a', [], 'b', [], 'al', [], 'ak', []);

 

    al = a + (1 - r) * (b - a);

    ak = a + r * (b - a);

   

    fal = target_function(al);

    fak = target_function(ak);

   

    iter = 0;

    while abs(b - a) > epsilon

        iter = iter + 1;

        iter_info(iter).a = a;

        iter_info(iter).b = b;

        iter_info(iter).al = al;

        iter_info(iter).ak = ak;

 

        if fal < fak

            b = ak;

            ak = al;

            fak = fal;

            al = a + (1 - r) * (b - a);

            fal = target_function(al);

        else

            a = al;

            al = ak;

            fal = fak;

            ak = a + r * (b - a);

            fak = target_function(ak);

        end

    end

   

    xmin = (a + b) / 2;

    fmin = target_function(xmin);

end

 

function y = target_function(x)

    % Define your target function here

    y = x^2 + 3*x + 2;

end

测试:

a = 0;  % 初始搜索区间左端点

b = 1;  % 初始搜索区间右端点

epsilon = 1e-6;  % 精度

 

[xmin, fmin, iter_info] = golds(a, b, epsilon);

 

disp(['极小点:', num2str(xmin)]);

disp(['极小值:', num2str(fmin)]);

disp('迭代信息:');

disp('  迭代次数   a       b       al      ak');

for i = 1:length(iter_info)

    disp([num2str(i), '       ', num2str(iter_info(i).a), '   ', ...

          num2str(iter_info(i).b), '   ', num2str(iter_info(i).al), '   ', ...

          num2str(iter_info(i).ak)]);

end

3. 结果

 

四、心得体会

     这次实验让我深入了解了一维寻优中的黄金分割法。通过实现该算法,我学会了如何在一个区间内寻找函数的极小值点,并且可以控制精度以满足特定的要求。

首先,我了解到黄金分割法的核心思想是不断缩小搜索区间,使得每次迭代都能够尽可能减少函数的计算次数,提高寻优效率。在这个过程中,进退法帮助确定了初始的搜索区间,然后通过不断缩小区间来逼近最优解。

在编写 MATLAB 程序实现黄金分割法时,我按照算法步骤一步步进行了实现。通过定义目标函数、设定初始搜索区间、设置精度要求以及迭代过程中的参数更新,我成功地实现了该算法。在每次迭代中,我都输出了当前的搜索区间和相关参数的值,以便于跟踪算法的执行过程。

通过这次实验,我不仅学会了一个新的优化方法,还提高了自己的编程能力。我意识到了优化算法的重要性以及在实际问题中的应用价值。这次实验为我今后学习和应用无约束优化方法奠定了基础,同时也培养了我在计算机领域的应用能力。

posted @ 2024-06-13 15:53  liuxuechao  阅读(3)  评论(0编辑  收藏  举报