强wolfe准则的FR共轭梯度算法matlab
时间: 2023-11-03 22:34:35 浏览: 35
function [x, F] = FR_CG(f, df, x0, tol, maxiter)
% 强 Wolfe 准则的共轭梯度法
% f: 目标函数
% df: 目标函数的梯度
% x0: 初始点
% tol: 精度要求
% maxiter: 最大迭代次数
% x: 迭代结束时的点
% F: 迭代结束时的函数值
x = x0;
F = f(x);
g = df(x);
d = -g;
iter = 0;
while norm(g) > tol && iter < maxiter
alpha = 1;
[F_new, g_new] = wolfe(f, df, x, alpha, d);
while F_new > F + 1e-4 * alpha * g' * d
alpha = (alpha ^ 2 * g' * d) / (2 * (F_new - F + alpha * g' * d));
[F_new, g_new] = wolfe(f, df, x, alpha, d);
end
beta = (g_new' * g_new - g' * g_new) / (g' * g);
d = -g_new + beta * d;
x = x + alpha * d;
g = g_new;
F = F_new;
iter = iter + 1;
end
end
function [F, g] = wolfe(f, df, x, alpha, d)
% Wolfe 准则
% f: 目标函数
% df: 目标函数的梯度
% x: 当前点
% alpha: 步长
% d: 搜索方向
% F: 目标函数在 x + alpha * d 处的函数值
% g: 目标函数在 x + alpha * d 处的梯度
c1 = 1e-4;
c2 = 0.9;
F = f(x + alpha * d);
g = df(x + alpha * d);
F0 = f(x);
g0 = df(x);
while F > F0 + c1 * alpha * g0' * d || g' * d < c2 * g0' * d
if F > F0 + c1 * alpha * g0' * d
alpha = alpha / 2;
else
alpha = alpha * 2;
end
F = f(x + alpha * d);
g = df(x + alpha * d);
end
end