工程数学实验四
代码
% 定义目标函数和梯度
f = @(x) 100*(x(1)^2 - x(2))^2 + (x(1) - 1)^2;
grad = @(x) [400*x(1)*(x(1)^2-x(2)) + 2*(x(1)-1); -200*(x(1)^2-x(2))];
% 设置初始点和迭代参数
x0 = [0; 0];
epsilon = 1e-6;
max_iter = 100;
% 初始化迭代计数器和搜索方向
k = 0;
d = -grad(x0);
% 迭代过程
while k < max_iter
% 计算步长
alpha = Armijo(f, grad, x0, d);
% 更新迭代点
x1 = x0 + alpha*d;
% 计算Beta
beta = norm(grad(x1))^2 / norm(grad(x0))^2;
% 更新搜索方向
d = -grad(x1) + beta*d;
% 判断收敛
if norm(grad(x1)) < epsilon
break;
end
% 更新迭代计数器和迭代点
k = k + 1;
x0 = x1;
end
% 输出最优解和最优值
x_opt = x1;
f_opt = f(x_opt);
disp(['最优解 x_opt = [', num2str(x_opt(1)), ', ', num2str(x_opt(2)), ']']);
disp(['最优值 f_opt = ', num2str(f_opt)]);
disp(['迭代次数 k = ', num2str(k)]);
3. 结果
|
初始点 |
实验二最优解 |
实验二最优值 |
实验二迭代次数 |
实验三最优解 |
实验三最优值 |
实验三迭代次数 |
本实验最优解 |
本实验最优值 |
本实验迭代次数 |
|
(0,0) |
(0.99997,1) |
2.89e-10 |
21 |
(0.99997,1) |
2.89e-10 |
21 |
(0.99997,1) |
2.89e-10 |
5 |
|
(1,1) |
(0.99997,1) |
2.88e-10 |
19 |
(0.99997,1) |
2.88e-10 |
19 |
(0.99997,1) |
2.88e-10 |
6 |
|
(2,2) |
(0.99997,1) |
2.89e-10 |
26 |
(0.99997,1) |
2.89e-10 |
26 |
(0.99997,1) |
2.89e-10 |
8 |
|
(-1,-1) |
(0.99997,1) |
2.89e-10 |
22 |
(0.99997,1) |
2.89e-10 |
22 |
(0.99997,1) |
2.89e-10 |
5 |
四、心得体会
从实验结果可以看出,共轭梯度法在解决这个无约束优化问题时,与实验二和实验三中的梯度下降法和牛顿法相比,无论是最优解、最优值还是迭代次数都表现更好。尤其是在初始点较远离最优解的情况下,共轭梯度法的收敛速度更快。这说明了共轭梯度法的高效性和可靠性,这也是它在大规模优化问题中被广泛应用的原因之一
浙公网安备 33010602011771号