工程数学实验四

function [x_opt, f_opt, iter] = conjugate_gradient()

    % 定义目标函数
    f = @(x) 100*(x(1)^2 - x(2))^2 + (x(1) - 1)^2;

    % 计算目标函数的梯度
    grad_f = @(x) [400*x(1)*(x(1)^2 - x(2)) + 2*(x(1) - 1); -200*(x(1)^2 - x(2))];

    % 定义终止准则
    epsilon = 1e-5;

    % 定义 Armijo 条件参数
    rho = 0.5; % 步长衰减因子
    c = 0.1;  % 条件参数

    % 设置初始点
    x0_list = [0, 0; -1, 1; 2, -2]; % 与上面的最速下降法和牛顿法使用相同的初始点

    for k = 1:size(x0_list, 1)
        % 初始化变量
        iter = 0;
        x_opt = x0_list(k, :)';
        f_opt = f(x_opt);
        grad_norm = norm(grad_f(x_opt));
        p = -grad_f(x_opt);

        % 共轭梯度法迭代过程
        while grad_norm >= epsilon
            % 计算步长
            alpha = armijo_line_search(x_opt, p, f, grad_f, rho, c);

            % 更新变量
            x_opt_prev = x_opt;
            x_opt = x_opt + alpha * p;
            f_opt_prev = f_opt;
            f_opt = f(x_opt);
            grad_prev = grad_f(x_opt_prev);
            grad_opt = grad_f(x_opt);

            % 计算 beta 参数
            beta = (grad_opt' * grad_opt) / (grad_prev' * grad_prev);

            % 计算共轭梯度方向
            p = -grad_opt + beta * p;

            % 更新迭代次数
            iter = iter + 1;
            grad_norm = norm(grad_opt);
        end

        % 输出结果
        fprintf('初始点:%s\n', mat2str(x0_list(k, :)));
        fprintf('最优解:%s\n', mat2str(x_opt));
        fprintf('最优值:%f\n', f_opt);
        fprintf('迭代次数:%d\n', iter);
        disp('----------------------');
    end
end

function alpha = armijo_line_search(x, p, f, grad_f, rho, c)
    % Armijo 非精确线搜索方法
    alpha = 1;
    while f(x + alpha * p) > f(x) + c * alpha * grad_f(x)' * p
        alpha = rho * alpha;
    end
end
% 调用 FR 共轭梯度法函数
[x_opt, f_opt, iter] = conjugate_gradient();

 

posted @ 2023-05-25 10:19  庞司令  阅读(50)  评论(0)    收藏  举报