6.5

上午进行了工程数学的实验。

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

一、实验目的

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

二、实验内容

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

 

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

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

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

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

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

1. 算法步骤

(1)确定初始区间:

首先随机选取两个不同的初始点a和b,并计算函数在这两个点上的取值f(a)和f(b)。

如果f(a) < f(b),则初始区间为[a, b];如果f(b) < f(a),则初始区间为[b, a]。

(2)迭代计算:

根据黄金分割比例,将当前区间[a, b]分成两个子区间c和d,使得c到d的比例与b到a的比例相同,即c = b - 0.618(b - a),d = a + 0.618(b - a)。

计算函数在c和d上的取值f(c)和f(d),并比较大小。

如果f(c) < f(d),则新的区间为[a, d];如果f(d) < f(c),则新的区间为[c, b]。

不断迭代以上步骤,直到达到设定的精度要求(即区间长度小于等于10^-6)为止。

(3)输出结果:

当达到精度要求时,取区间中点作为极小点的近似值,计算该点的函数值作为极小值的近似值。

输出极小点和极小值的近似值作为最终结果。

2. 代码

function [xmin, fmin, a_vals, b_vals, al_vals, ak_vals] = golds(f, a, b, epsilon)

    % 黄金分割法求极小值

    % 输入:

    % f - 目标函数句柄

    % a, b - 初始区间

    % epsilon - 精度要求

    % 输出:

    % xmin - 极小值点

    % fmin - 极小值

    % a_vals, b_vals, al_vals, ak_vals - 每次迭代的 a, b, al, ak 值

 

    phi = (1 + sqrt(5)) / 2;  % 黄金比例常数

    resphi = 2 - phi;         % 1 / phi

 

    % 记录每次迭代的 a, b, al, ak 值

    a_vals = [];

    b_vals = [];

    al_vals = [];

    ak_vals = [];

 

    % 计算初始 al 和 ak

    al = b - resphi * (b - a);

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

    fal = f(al);

    fak = f(ak);

 

    % 迭代

    while (b - a) > epsilon

        % 记录当前迭代的 a, b, al, ak 值

        a_vals = [a_vals, a];

        b_vals = [b_vals, b];

        al_vals = [al_vals, al];

        ak_vals = [ak_vals, ak];

 

        if fal < fak

            b = ak;

            ak = al;

            fak = fal;

            al = b - resphi * (b - a);

            fal = f(al);

        else

            a = al;

            al = ak;

            fal = fak;

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

            fak = f(ak);

        end

    end

 

    % 极小值点和极小值

    xmin = (a + b) / 2;

    fmin = f(xmin);

end

 

实例调用代码:

% 示例函数

f = @(x) (x - 2)^2 + 3;

 

% 初始区间和精度

a = 0;

b = 4;

epsilon = 1e-6;

 

% 调用黄金分割法函数

[xmin, fmin, a_vals, b_vals, al_vals, ak_vals] = golds(f, a, b, epsilon);

 

% 输出结果

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

fprintf('极小值: %.6f\n', fmin);

 

% 显示每次迭代的值

fprintf('迭代次数: %d\n', length(a_vals));

for i = 1:length(a_vals)

    fprintf('迭代 %d: a = %.6f, b = %.6f, al = %.6f, ak = %.6f\n', i, a_vals(i), b_vals(i), al_vals(i), ak_vals(i));

end

posted @ 2024-06-14 10:50  Code13  阅读(42)  评论(0编辑  收藏  举报