2024.6.3

实验二:最速下降法程序设计
一、实验目的
通过最速下降法的程序设计,为今后的约束优化方法的学习和编程奠定基础;掌握负梯度方向的定义和最速下降法的迭代公式 ;通过此次实验,进一步巩固最速下降法的基本原理和思想。
二、实验内容
(1)求解无约束优化问题: ;
(2)终止准则取 ;
(3)完成最速下降法(负梯度法)的MATLAB编程、调试;
(4)要求选取多个不同的初始点,并给出迭代次数,最优函数值等相关信息,有能力的同学尝试画出最优值随迭代次数变化的曲线图;
三、算法步骤、代码、及结果
1. 算法步骤
1. 初始化: 选择一个初始点 (x^0),设置迭代计数器 (k = 0),以及迭代终止准则的阈值 (\epsilon)。
2. 计算负梯度: 计算在当前点 (x^k) 处的负梯度 (d^k = -\nabla f(x^k))。
3. 选择步长: 通过一维搜索或其他方法选择步长 (\alpha_k)。
4. 更新变量: 使用最速下降法迭代公式更新变量 (x^{(k+1)} = x^k + \alpha_k d^k)。
5. 检查终止准则: 如果 (|f(x^{(k+1)}) - f(x^{(k)})| < \epsilon),则停止迭代,否则继续迭代。
6. 增加迭代计数器: (k = k + 1),返回步骤 2。

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)))^2;

% 最速下降法求解
% 设定初始点和迭代终止准则
x0_list = [-2, 2, 0, 0; -3, 3, 0, 0; 0.5, -1.5, 0, 0]; % 多个不同的初始点
max_iter = 10000;
tol = 1e-5;
results = zeros(size(x0_list, 1), 4); % 存储最优结果

for i = 1:size(x0_list, 1)
x0 = x0_list(i,:);
x = x0';
a = 0.01; % 步长
iter = 0;
grad_norm = inf;
func_values = zeros(max_iter, 1); % 新增:记录每一步的函数值
while grad_norm > tol && iter < max_iter
iter = iter + 1;
grad = [400*x(1)^3-400*x(1)*x(2)+2*x(1)-2;
200*(x(2)-x(1)^2);
10*(x(3)-x(4));
-10*(x(3)-x(4))];
x_new = x - a*grad;
if f(x_new) < f(x)
x = x_new;
a = a * 1.1;
else
a = a * 0.5;
end
grad_norm = norm(grad);
func_values(iter) = f(x); % 记录当前迭代的函数值
end
results(i, :) = x;
fprintf('初始点 (%g, %g, %g, %g)\n', x0(1), x0(2), x0(3), x0(4));
fprintf('迭代次数: %d\n', iter);
fprintf('最优点: (%g, %g, %g, %g)\n', x(1), x(2), x(3), x(4));
fprintf('最优函数值: %g\n', f(x));
fprintf('\n');
% 绘制当前初始点对应的函数值变化曲线
plot(1:iter, func_values(1:iter), 'LineWidth', 1.5, ...
'DisplayName', sprintf('初始点%d', i));
hold on;
end

% 添加标题、标签、图例和网格
xlabel('迭代次数');
ylabel('函数值');
title('函数值随迭代次数变化');
legend('show');
grid on;
hold off;

3. 结果



四、心得体会
在完成这次实验后,我对最速下降法有了更深入的理解和掌握。通过这次实验,我学会了如何使用最速下降法来解决无约束优化问题,并且掌握了负梯度方向的定义以及最速下降法的迭代公式。在实践中,我发现了以下几点心得体会:

1.理解梯度方向的重要性:最速下降法的核心思想是沿着负梯度方向迭代搜索,这意味着我们在每一步都朝着使目标函数减小的方向前进。理解梯度方向对于理解最速下降法的收敛性和迭代过程至关重要。
2.调整步长的重要性:在每一步迭代中,需要确定合适的步长(学习率)来控制迭代的速度和稳定性。步长太小会导致收敛速度慢,而步长太大可能会导致震荡或者发散。因此,选择合适的步长对于算法的性能至关重要。
3.初始点的选择影响迭代效果:在实验中我尝试了多个不同的初始点,并观察了迭代的结果。我发现初始点的选择对于算法的迭代次数和最终收敛点有着重要的影响。有时候一个好的初始点能够加速算法的收敛,而一个不好的初始点可能导致算法陷入局部最优解。
4.理解迭代过程的收敛性:通过观察迭代过程中目标函数值的变化,我更深入地理解了最速下降法的收敛性。随着迭代次数的增加,目标函数值逐渐减小并趋于稳定,直到达到一个接近最优解的值。
5.终止准则的选择:在实验中,我使用了目标函数值的变化量作为终止准则。合适的终止准则能够保证算法在达到一定精度后停止迭代,从而节省计算资源。

通过这次实验,我不仅掌握了最速下降法的基本原理和思想,还学会了如何使用 MATLAB 对其进行编程和调试。这些知识和经验对我今后学习和应用约束优化方法都具有重要的指导意义。

posted @ 2024-06-13 15:54  liuxuechao  阅读(11)  评论(0编辑  收藏  举报