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();
标签:opt,end,工程,iter,实验,alpha,数学,prev,grad From: https://www.cnblogs.com/psh888/p/17430388.html