6.14学习任务
进行了工程数学实验四的练习
实验四:共轭梯度法
一、实验目的
掌握共轭梯度法的基本思想及其迭代步骤;学会运用MATLAB编程实现常用优化算法;能够正确处理实验数据和分析实验结果及调试程序
二、实验内容
(1)求解无约束优化问题:
(2)终止准则取;
(3)完成FR共轭梯度法的MATLAB编程、调试;
(4)选取几个与实验二实验三中相同的初始点,并给出相关实验结果的对比及分析(从最优解、最优值、收敛速度(迭代次数)等方面进行比较);
(5)按照模板撰写实验报告,要求规范整洁。
三、算法步骤、代码、及结果
1. 算法步骤
2. 代码
% 定义目标函数及其梯度和海森矩阵
f = @(x) (x(1) + 10*x(2))^2 + 5*(x(3) - x(4))^2 + (x(2) - 2*x(3))^4 + 10*(x(1) - x(4))^4;
grad_f = @(x) [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];
% 初始点和终止准则
x0_list = [-2, 2, 0, 0; -3, 3, 0, 0; 0.5, -1.5, 0, 0]; % 四个初始点
tol = 1e-5;
for i = 1:size(x0_list, 1)
x0 = x0_list(i,:);
x = x0';
iter = 0;
grad_norm = inf; % 初始化为正无穷
d = -grad_f(x);
alpha = 1; % 初始步长
while grad_norm > tol
iter = iter + 1;
% 进行非精确线搜索,确定步长 alpha
while f(x + alpha * d) > f(x) + 0.1 * alpha * grad_f(x)' * d
alpha = alpha / 2;
end
% 计算 FR 共轭梯度下降方向
if iter == 1
g_prev = grad_f(x - d);
beta = 0;
else
g = grad_f(x);
y = g - g_prev;
beta = (y' * (g - grad_f(x))) / (y' * y);
g_prev = g;
end
s = alpha * d;
d = -grad_f(x + s) + beta * d;
x = x + s;
grad_norm = norm(grad_f(x));
end
fprintf('Initial point (%g, %g, %g, %g)\n', x0(1), x0(2), x0(3), x0(4));
fprintf('Number of iterations: %d\n', iter);
fprintf('Optimal point: (%g, %g, %g, %g)\n', x(1), x(2), x(3), x(4));
fprintf('Optimal function value: %g\n', f(x));
fprintf('\n');
end
3. 结果
untitled7
Initial point (-2, 2, 0, 0)
Number of iterations: 179274
Optimal point: (-0.0113853, 0.00113849, -0.00567336, -0.00567451)
Optimal function value: 3.49412e-08
Initial point (-3, 3, 0, 0)
Number of iterations: 358642
Optimal point: (-0.0113853, 0.00113849, -0.00567336, -0.00567451)
Optimal function value: 3.49414e-08
Initial point (0.5, -1.5, 0, 0)
Number of iterations: 89472
Optimal point: (0.0113852, -0.00113849, 0.00567334, 0.00567449)
Optimal function value: 3.49408e-08