5.22

工程数学 黄金分割法

function [xmin, fmin, iter] = golds(func, a, b, tol)

    % func: 要优化的函数句柄

    % a, b: 初始搜索区间的下界和上界

    % tol: 精度要求

 

    % 黄金分割比例

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

    c1 = b - phi * (b - a);  % ak,即右测试点

    c2 = a + phi * (b - a);  % al,即左测试点

 

    f1 = func(c1);

    f2 = func(c2);

    iter = 0;

 

    while abs(b - a) > tol

        if f1 < f2

            b = c2;

            ak = c1;

            f1_old = f2;

            c2 = c1;

            f2 = f1;

            c1 = b - phi * (b - a);

            f1 = func(c1);

        else

            a = c1;

            al = c2;

            f2_old = f1;

            c1 = c2;

            f1 = f2;

            c2 = a + phi * (b - a);

            f2 = func(c2);

        end

        iter = iter + 1;

        fprintf('迭代次数 %d: a = %f, b = %f, al = %f, ak = %f, f(al) = %f, f(ak) = %f\n', iter, a, b, al, ak, f2, f1);

    end

 

    % 确定极小点和极小值

    if f1 < f2

        xmin = c1;

        fmin = f1;

    else

        xmin = c2;

        fmin = f2;

    end

end

 

% 使用示例函数 f(x) = x^2

func = @(x) x.^2;

% 假设的初始区间 [a, b]

a = -2;

b = 2;

% 精度要求

tol = 1e-6;

 

% 调用 golds 函数

[xmin, fmin, iter] = golds(func, a, b, tol);

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

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

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

posted @ 2024-05-22 20:22  catsahsy  阅读(5)  评论(0编辑  收藏  举报