matlab实验2-最速下降法

steepest_descent.m:

function [x, fval, iter, fval_history] = steepest_descent(x0, max_iter, epsilon)
    % 最速下降法求解无约束优化问题
    % 输入参数:
    % x0: 初始点
    % max_iter: 最大迭代次数
    % epsilon: 终止准则阈值
    % 输出参数:
    % x: 最优解
    % fval: 最优函数值
    % iter: 迭代次数
    % fval_history: 函数值历史记录
    
    x = x0;
    iter = 0;
    fval_history = zeros(max_iter, 1);
    
    while iter < max_iter
        % 计算当前点的梯度
        grad = gradient(x);
        
        % 判断是否满足终止准则
        if norm(grad) < epsilon
            break;
        end
        
        % 计算搜索方向(负梯度方向)
        d = -grad;
        
        % 一维搜索求步长
        alpha = golden_section(x, d);
        
        % 更新迭代点
        x = x + alpha * d;
        
        % 记录当前函数值
        fval_history(iter + 1) = objective(x);
        
        iter = iter + 1;
    end
    
    % 最终函数值
    fval = objective(x);
    % 裁剪函数值历史记录
    fval_history = fval_history(1:iter);
end

function f = objective(x)
    % 目标函数
    f = 100 * (x(2) - x(1)^2)^2 + (1 - x(1))^2;
end

function g = gradient(x)
    % 目标函数的梯度
    g = zeros(2, 1);
    g(1) = -400 * x(1) * (x(2) - x(1)^2) - 2 * (1 - x(1));
    g(2) = 200 * (x(2) - x(1)^2);
end

function alpha = golden_section(x, d)
    % 黄金分割法进行一维搜索
    a = 0;
    b = 1;
    rho = (sqrt(5) - 1) / 2;
    epsilon = 1e-5;
    
    lambda = a + (1 - rho) * (b - a);
    mu = a + rho * (b - a);
    
    f_lambda = phi(lambda, x, d);
    f_mu = phi(mu, x, d);
    
    while abs(b - a) > epsilon
        if f_lambda > f_mu
            a = lambda;
            lambda = mu;
            mu = a + rho * (b - a);
            f_lambda = f_mu;
            f_mu = phi(mu, x, d);
        else
            b = mu;
            mu = lambda;
            lambda = a + (1 - rho) * (b - a);
            f_mu = f_lambda;
            f_lambda = phi(lambda, x, d);
        end
    end
    
    alpha = (a + b) / 2;
end

function f = phi(alpha, x, d)
    % 一维搜索的目标函数
    x_new = x + alpha * d;
    f = objective(x_new);
end

main.m:

% 测试不同初始点
initial_points = [
    -1.2, 1;
    0.5, 0.5;
    2, 2;
    -2, -2
];

max_iter = 1000;
epsilon = 1e-6;

for i = 1:size(initial_points, 1)
    x0 = initial_points(i, :)';
    [x, fval, iter, fval_history] = steepest_descent(x0, max_iter, epsilon);
    
    fprintf('\n初始点: [%.2f, %.2f]\n', x0(1), x0(2));
    fprintf('最优解: [%.6f, %.6f]\n', x(1), x(2));
    fprintf('最优函数值: %.6f\n', fval);
    fprintf('迭代次数: %d\n', iter);
    
    % 绘制函数值随迭代次数的变化曲线
    figure;
    plot(0:iter-1, fval_history, 'b-', 'LineWidth', 1.5);
    title(sprintf('初始点 [%.2f, %.2f] 的收敛曲线', x0(1), x0(2)));
    xlabel('迭代次数');
    ylabel('函数值');
    grid on;
end
posted @ 2025-05-13 10:00  vivi_vimi  阅读(54)  评论(0)    收藏  举报