工程数学实验二

复制代码
% 定义目标函数的梯度
grad_f = @(x) [400*x(1)*(x(1)^2 - x(2)) + 2*(x(1) - 1); -200*(x(1)^2 - x(2))];

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

% 定义最大迭代次数
max_iterations = 1000;

% 初始点列表
initial_points = [0, 0; -1, 1; 2, -2];

% 迭代过程函数
function [x_opt, f_opt, iterations] = gradient_descent(f, grad_f, x0, epsilon, max_iterations)
    x = x0; % 初始化x
    f_values = []; % 用于存储每次迭代的函数值
    iterations = 0; % 迭代次数
    
    while iterations < max_iterations
        f_values = [f_values, f(x)]; % 记录当前迭代的函数值
        grad = grad_f(x); % 计算梯度
        alpha = 0.01; % 步长(学习率)选择为常数0.01
        x = x - alpha * grad; % 更新x
        iterations = iterations + 1; % 迭代次数加1
        
        % 判断终止准则
        if norm(grad) < epsilon
            break;
        end
    end
    
    x_opt = x; % 最优解
    f_opt = f(x); % 最优函数值
end

% 使用最速下降法求解并输出结果
for i = 1:size(initial_points, 1)
    x0 = initial_points(i, :);
    [x_opt, f_opt, iterations] = gradient_descent(f, grad_f, x0, epsilon, max_iterations);
    fprintf('初始点: [%d, %d]\n', x0);
    fprintf('迭代次数: %d\n', iterations);
    fprintf('最优函数值: %.6f\n', f_opt);
    fprintf('最优解: [%.6f, %.6f]\n', x_opt);
    fprintf('-------------------------------------\n');
end
复制代码

 

posted @   庞司令  阅读(16)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示