5.2
工程数学实验2
• 所花时间:2
• 代码行数:468
• 博客容量:1
• 代码如下:
实验二:最速下降法程序设计
一、实验目的
通过最速下降法的程序设计,为今后的约束优化方法的学习和编程奠定基础;掌握负梯度方向的定义和最速下降法的迭代公式 ;通过此次实验,进一步巩固最速下降法的基本原理和思想。
二、实验内容
(1)求解无约束优化问题: ;
(2)终止准则取 ;
(3)完成最速下降法(负梯度法)的MATLAB编程、调试;
(4)要求选取多个不同的初始点,并给出迭代次数,最优函数值等相关信息,有能力的同学尝试画出最优值随迭代次数变化的曲线图;
(5)按照模板撰写实验报告,要求规范整洁。
三、算法步骤、代码、及结果
1. 算法步骤
• 初始化:设定初始点 𝑥0x0、最大迭代次数、精度、步长缩减率 𝜌ρ 以及线搜索参数 𝜎σ。
• 计算梯度:计算目标函数的梯度。
• 判断收敛性:如果梯度的范数小于设定的精度,停止迭代。
• 线搜索:通过 Armijo 搜索技术确定合适的步长。
• 更新迭代点:使用找到的步长更新当前点。
• 迭代:重复上述步骤直到满足终止条件。
2. 代码
function steepest_descent()
% 定义目标函数
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
];
% 初始点集合
initial_points = [
0, 0, 0, 0;
1, 1, 1, 1;
-1, -1, -1, -1;
2, 2, 2, 2;
-2, -2, -2, -2
];
% 终止准则
tol = 1e-6;
% 最大迭代次数
max_iter = 10000;
% 遍历初始点
for i = 1:size(initial_points, 1)
x0 = initial_points(i, :)';
[x_opt, f_val, iter, f_values] = gradient_descent(f, grad_f, x0, tol, max_iter);
fprintf('初始点: [%f, %f, %f, %f]\n', x0);
fprintf('迭代次数: %d\n', iter);
fprintf('最优函数值: %f\n', f_val);
fprintf('最优点: [%f, %f, %f, %f]\n\n', x_opt);
% 绘制最优值随迭代次数变化的曲线图
figure;
plot(1:iter, f_values, '-o');
title(sprintf('初始点 [%f, %f, %f, %f]', x0));
xlabel('迭代次数');
ylabel('函数值');
grid on;
end
end
function [x_opt, f_val, iter, f_values] = gradient_descent(f, grad_f, x0, tol, max_iter)
x = x0;
f_values = zeros(max_iter, 1);
for iter = 1:max_iter
grad = grad_f(x);
f_values(iter) = f(x);
if norm(grad) < tol
break;
end
alpha = line_search(f, grad_f, x, grad);
x = x - alpha * grad;
end
x_opt = x;
f_val = f(x_opt);
f_values = f_values(1:iter);
end
function alpha = line_search(f, grad_f, x, grad)
alpha = 1;
c = 1e-4;
rho = 0.9;
while f(x - alpha * grad) > f(x) - c * alpha * (grad' * grad)
alpha = rho * alpha;
end
end
3. 结果
初始点: [0.000000, 0.000000, 0.000000, 0.000000]
迭代次数: 1
最优函数值: 0.000000
最优点: [0.000000, 0.000000, 0.000000, 0.000000]
初始点: [1.000000, 1.000000, 1.000000, 1.000000]
迭代次数: 10000
最优函数值: 0.000002
最优点: [0.030411, -0.003037, 0.015144, 0.015166]
初始点: [-1.000000, -1.000000, -1.000000, -1.000000]
迭代次数: 10000
最优函数值: 0.000002
最优点: [-0.030411, 0.003037, -0.015144, -0.015166]
初始点: [2.000000, 2.000000, 2.000000, 2.000000]
迭代次数: 10000
最优函数值: 0.000002
最优点: [0.030465, -0.003042, 0.015171, 0.015193]
初始点: [-2.000000, -2.000000, -2.000000, -2.000000]
迭代次数: 10000
最优函数值: 0.000002
最优点: [-0.030465, 0.003042, -0.015171, -0.015193]
初始点: [10.000000, 10.000000, 10.000000, 10.000000]
迭代次数: 10000
最优函数值: 0.000002
最优点: [0.030558, -0.003058, 0.015218, 0.015240]
初始点: [-8.000000, -9.000000, -6.000000, -2.000000]
迭代次数: 10000
最优函数值: 0.000002
最优点: [-0.030532, 0.003049, -0.015204, -0.015227]
所以最终结果为:
最优函数值: 0.000000
最优点: [0.000000, 0.000000, 0.000000, 0.000000]
四、心得体会
通过这个实验,我学会了以下几点:
1. 梯度下降算法的实现: 通过编写 MATLAB 代码,我深入了解了梯度下降算法的实现原理。了解了如何计算目标函数的梯度,并如何利用梯度信息来更新参数,逐步优化目标函数。
2. 算法调试与参数调整: 在实验中,我学会了如何调试算法并进行参数调整。通过观察函数值随迭代次数的变化趋势,我可以调整学习率等参数,以提高算法的性能和收敛速度。
3. 可视化优化过程: 通过绘制最优值随迭代次数变化的曲线图,我可以直观地观察算法的收敛情况。这种可视化方式使我更好地理解了算法的工作原理,并能够及时发现问题并进行调整。
4. 初始点选择的重要性: 实验中,我意识到初始点的选择对算法的收敛性和性能有重要影响。不同的初始点可能导致算法收敛到不同的局部最优解,因此选择合适的初始点是优化过程中的关键之一。
5. 数值优化问题的应用: 通过解决一个具体的数值优化问题,我更深入地理解了优化算法在实际问题中的应用。这种经验将有助于我将优化算法应用到其他领域的问题中,例如机器学习模型的训练过程中。
浙公网安备 33010602011771号