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

一、实验目的

 

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

 

二、实验内容

 

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

 

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

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

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

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

 

 

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

1. 算法步骤

定义目标函数:

首先,定义了目标函数 f(x) = x^2 - x + 6。。

使用进退法确定初始搜索区间:

选择一个初始点 x0 和步长 h。

计算 f(x0) 和 f(x0 + h)。

根据函数值的变化确定搜索方向,如果 f(x0 + h) 比 f(x0) 小,则沿此方向继续搜索;否则,反向搜索。

通过多次迭代,确定一个区间 [a, b],使得函数值在该区间的两端点都比区间内的某一点大,这表明极小值点可能位于此区间内。

应用0.618法进行搜索:

计算黄金分割比例 rho = (sqrt(5) - 1) / 2,约等于0.618。

设置搜索精度 tol,例如 1e-6。

在区间 [a, b] 内,根据黄金分割比例选择两个点 x1 和 x2。

计算这两个点的函数值 f1 和 f2。

比较 f1 和 f2 的大小,根据哪个更小来缩减搜索区间:

如果 f1 < f2,则令 b = x2,即舍弃区间 [x2, b]。

如果 f1 >= f2,则令 a = x1,即舍弃区间 [a, x1]。

重复上述步骤,直到区间 [a, b] 的长度小于预设的精度 tol。

计算极小值点和极小值:

当搜索区间足够小时,认为区间的中点即为极小值点的近似值,即 xmin = (a + b) / 2。

计算该点的函数值 fmin = f(xmin),即为极小值的近似值。

输出结果:

打印或返回计算得到的极小值点 xmin 和极小值 fmin。

2. 代码

function [xmin, fmin] = goldenSectionSearch() 

    % 目标函数 

    f = @(x) x.^2 - x + 6; 

     

    % 进退法确定初始区间 

    x0 = 0; % 初始点 

    h = 1; % 初始步长 

    x1 = x0; 

    f1 = f(x1); 

    x2 = x0 + h; 

    f2 = f(x2); 

     

    % 确定搜索方向 

    while f2 >= f1 

        h = -h; % 反向搜索 

        x2 = x1; 

        f2 = f1; 

        x1 = x1 + h; 

        f1 = f(x1); 

    end 

     

    % 确定初始区间 [a, b] 

    a = x1; 

    b = x2; 

    fa = f1; 

    fb = f2; 

     

    % 黄金分割比例 

    rho = (sqrt(5) - 1) / 2; 

     

    % 精度要求 

    tol = 1e-6; 

     

    % 0.618法搜索极小值点 

    while (b - a) > tol 

        x1 = b - rho * (b - a); 

        x2 = a + rho * (b - a); 

        f1 = f(x1); 

        f2 = f(x2); 

         

        if f1 < f2 

            b = x2; 

        else 

            a = x1; 

        end 

    end 

     

    % 计算极小值点和极小值 

    xmin = (a + b) / 2; 

    fmin = f(xmin); 

     

    % 输出结果 

    fprintf('极小值点:%f, 极小值:%f\n', xmin, fmin); 

end

 

3. 结果

 

四、心得体会

通过本次实验设置最优化算法计算函数,我理解了0.618法的实现原理.

0.618法(黄金分割法)是一种通过不断缩小搜索区间来逼近函数极小值点的方法。该方法利用黄金分割比例0.618来确定新区间的分割点,并通过比较函数值的大小来更新搜索区间,直至满足给定的精度要求。

 

这对于我来处理最优化问题很有帮助,编写程序的时候更加清晰步骤