今天学习了共轭梯度法 代码如下
function [x_min, f_min] = FR_conjugate_gradient()
% 初始点
x = [2; 2; 2; 2];
% 初始梯度
g = gradient(x);
% FR共轭方向
d = -g;
% 终止准则参数
epsilon = 1e-6;
% Armijo条件参数
rho = 0.5;
c = 0.1;
% 最大迭代次数
max_iter = 1000;
% FR共轭梯度法迭代
for iter = 1:max_iter
% 非精确搜索
alpha = 1;
while f(x + alpha * d) > f(x) + c * alpha * g' * d
alpha = rho * alpha;
end
% 更新x
x = x + alpha * d;
% 更新梯度
g_old = g;
g = gradient(x);
% 终止条件
if norm(g) < epsilon
break;
end
% 更新FR共轭方向
beta = (g' * g) / (g_old' * g_old);
d = -g + beta * d;
end
% 返回最优解和最优值
x_min = x;
f_min = f(x);
end
% 目标函数
function val = f(x)
val = (x(1) + 10*x(2))^2 + 5*(x(3) - x(4))^2 + (x(2) - 2*x(3))^4 + 10*(x(1) - x(4))^4;
end
% 梯度函数
function grad = gradient(x)
grad = [
2*(x(1) + 10*x(2)) + 40*(x(1) - x(4))^3;
20*(x(1) + 10*x(2)) + 4*(x(2) - 2*x(3))^3;
10*(x(3) - x(4)) - 8*(x(2) - 2*x(3))^3;
-10*(x(3) - x(4)) - 40*(x(1) - x(4))^3
];
end
浙公网安备 33010602011771号