5.23

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

一、实验目的

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

 

二、实验内容

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

 

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

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

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

(4)按照模板撰写实验报告,要求规范整洁。

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

1. 算法步骤

  1. 初始化搜索区间 [a, b],并计算区间长度 L = b - a。
  2. 计算两个内点 x1 = a + 0.382 * L 和 x2 = a + 0.618 * L。
  3. 计算在 x1 和 x2 处的函数值 f(x1) 和 f(x2)。
  4. 如果 f(x1) < f(x2),则更新搜索区间为 [a, x2],否则更新搜索区间为 [x1, b]。
  5. 重复步骤2-4,直到搜索区间的长度小于给定的精度阈值 tol。
  6. 最终结果为搜索区间的中点,即 (a + b) / 2。

 

2. 代码

function golds(f, a, b)

    tol = 1e-6; % 精度

    L = b - a;

    iter = 1;

 

    while L > tol

        x1 = a + 0.382 * L;

        x2 = a + 0.618 * L;

 

        f1 = f(x1);

        f2 = f(x2);

 

        if f1 < f2

            b = x2;

        else

            a = x1;

        end

 

        % 输出每次迭代的a、b、al、ak的值

        fprintf('第%d次迭代:a = %.6f, b = %.6f, al = %.6f, ak = %.6f\n', iter, a, b, x1, x2);

 

        L = b - a;

        iter = iter + 1;

    end

 

    % 输出最终结果

    x_min = (a + b) / 2;

    f_min = f(x_min);

 

    fprintf('极小点: %f\n', x_min);

    fprintf('极小值: %f\n', f_min);

end

 

 

3. 结果

 

四、心得体会

 

在本次实验中,我学习了如何使用MATLAB来寻找一个函数的极小点和极小值。通过实现0.618法算法,我能够在给定的初始区间内迭代寻找函数的极小点,并且在一定精度范围内得到比较准确的结果。

通过本次实验,我学会了如何定义目标函数的函数句柄,如何绘制函数的图像以辅助确定初始区间,以及如何利用迭代算法逐步逼近极小点。在实验过程中,我遇到了一些错误,比如在定义目标函数时使用了错误的运算符,但通过查阅文档和改正错误,最终得以解决。

我认为这次实验对我的编程能力和数学建模能力有很好的提升。通过实践,我更加熟悉了MATLAB的使用,也加深了对优化算法的理解。我希望在未来的学习和工作中能够继续深入探索数学建模和优化算法的应用,为解决实际问题提供更好的解决方案。

posted @ 2024-06-18 09:21  晨观夕  阅读(2)  评论(0编辑  收藏  举报