强wolfe准则的FR共轭梯度算法matlab
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
相关推荐








