实验二:最速下降法程序设计
实验二:最速下降法程序设计
一、实验目的
通过最速下降法的程序设计,为今后的约束优化方法的学习和编程奠定基础;掌握负梯度方向的定义和最速下降法的迭代公式;通过此次实验,进一步巩固最速下降法的基本原理和思想。
二、实验内容
(1)求解无约束优化问题:;
(2)终止准则取;
(3)完成最速下降法(负梯度法)的MATLAB编程、调试;
(4)要求选取多个不同的初始点,并给出迭代次数,最优函数值等相关信息,有能力的同学尝试画出最优值随迭代次数变化的曲线图;
(5)按照模板撰写实验报告,要求规范整洁。
三、算法步骤、代码、及结果
1. 算法步骤
编写目标函数 f 和梯度函数 grad_f;
选择多个不同的初始点 x0;
调用 gradient_descent 函数并记录每个初始点的迭代次数、最优函数值等相关信息;
可以使用 MATLAB 的绘图功能,画出最优值随迭代次数变化的曲线图。
2. 代码
% 定义目标函数
f = @(x) 100*(x(2)-x(1)^2)^2 + (1-x(1))^2;
% 最速下降法求解
% 设定初始点和迭代终止准则
x0_list = [-2, 2; -3, 3; 0.5, -1.5]; % 多个不同的初始点
max_iter = 10000;
tol = 1e-5;
for i = 1:length(x0_list)
x0 = x0_list(i,:);
x = x0';
a = 0.01; % 步长
iter = 0;
grad_norm = inf; % 初始化为正无穷
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)];
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);
end
fprintf('Initial point (%g, %g)\n', x0(1), x0(2));
fprintf('Number of iterations: %d\n', iter);
fprintf('Optimal point: (%g, %g)\n', x(1), x(2));
fprintf('Optimal function value: %g\n', f(x));
fprintf('\n');
end
3. 结果
Initial point (-2, 2)
Number of iterations: 413
Optimal point: (-0.300609, 0.00015509)
Optimal function value: 0.0110275
Initial point (-3, 3)
Number of iterations: 560
Optimal point: (-0.300585, 0.000152774)
Optimal function value: 0.0110275
Initial point (0.5, -1.5)
Number of iterations: 87
Optimal point: (1, 1)
Optimal function value: 0
四、心得体会
在完成最速下降法(负梯度法)的MATLAB编程实验过程中,我深入了解了这种优化算法的原理和应用。通过选择不同的初始点,并进行多次迭代,我得以观察算法在不同情况下的表现。最速下降法是一种简单而有效的优化算法,通过沿着负梯度方向更新参数,逐步接近最优解。调试程序的过程中,迭代次数和梯度阈值对算法收敛的影响。
通过实验,成功求解了无约束优化问题,得到了不同初始点下的迭代次数和最优函数值。在最后阶段,绘制了最优值随迭代次数变化的曲线图,从中可以清晰地看出优化过程的收敛情况。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?