5.29

共轭梯度法程序设计

function [x, k] = fr_conjugate_gradient()

    % 初始猜测

    x = [1; 2; 2; 2];

    

    % 计算初始梯度

    g = grad_f(x);

    

    % 初始搜索方向

    d = -g;

    

    % 终止准则的容差

    tol = 1e-6;

    

    % 最大迭代次数

    max_iter = 1000;

    

    for k = 1:max_iter

        % 线搜索找到最优步长 alpha

        alpha = line_search(@f, x, d);

        

        % 更新 x

        x = x + alpha * d;

        

        % 计算新的梯度

        g_new = grad_f(x);

        

        % 检查收敛性

        if norm(g_new) <= tol

            break;

        end

        

        % 计算 beta

        beta = (g_new' * g_new) / (g' * g);

        

        % 更新搜索方向

        d = -g_new + beta * d;

        

        % 更新梯度

        g = g_new;

    end

end

 

function y = f(x)

    % 计算目标函数值

    y = (x(1) + 10 * x(2))^2 + 5 * (x(3) - x(4))^2 + (x(2) - 2 * x(3))^4 + 10 * (x(1) - x(4))^4;

end

 

function g = grad_f(x)

    % 计算目标函数的梯度

    g = zeros(4,1);

    g(1) = 2 * (x(1) + 10 * x(2)) + 40 * (x(1) - x(4))^3;

    g(2) = 20 * (x(1) + 10 * x(2)) + 4 * (x(2) - 2 * x(3))^3;

    g(3) = 10 * (x(3) - x(4)) - 8 * (x(2) - 2 * x(3))^3;

    g(4) = -10 * (x(3) - x(4)) - 40 * (x(1) - x(4))^3;

end

 

function alpha = line_search(f, x, d)

    % 简单回溯线搜索

    alpha = 1;

    rho = 0.5;

    c = 1e-4;

    while f(x + alpha * d) > f(x) + c * alpha * (grad_f(x)' * d)

        alpha = alpha * rho;

    end

end

 

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