2024/5/25
所学时间:2小时
代码行数:100
博客园数:1篇
所学知识:
实验二:最速下降法程序设计
一、实验目的
通过最速下降法的程序设计,为今后的约束优化方法的学习和编程奠定基础;掌握负梯度方向的定义和最速下降法的迭代公式;通过此次实验,进一步巩固最速下降法的基本原理和思想。
二、实验内容
(1)求解无约束优化问题:;
(2)终止准则取;
(3)完成最速下降法(负梯度法)的MATLAB编程、调试;
(4)要求选取多个不同的初始点,并给出迭代次数,最优函数值等相关信息,有能力的同学尝试画出最优值随迭代次数变化的曲线图;
三、算法步骤、代码、及结果
1. 算法步骤
1.选定初始点x和给定的精度要求e>0,令k=1.
2.若||Δf(x*)|<ε,则停算,x*=x;否则,令dk =-Δf(x)
3.在x处沿方向dk作线性搜索,得xk+1=xk+akdk,k=k+1,转步骤2
2. 代码
% 定义目标函数
f = @(x1,x2,x3,x4) (x1+10*x2)^2 + 5*(x3-x4)^2 + (2*x2-x3)^4 + 10*(x1-x4)^4;
% 计算目标函数的梯度
grad_f = @(x1,x2,x3,x4) [2*(x1+10*x2) + 40*(x1-x4)^3; 20*(x1+10*x2) + 8*(2*x2-x3)^3; 10*(x3-x4) - 4*(2*x2-x3); -10*(x3-x4) - 40*(x1-x4)^3];
% 设置初始点
initial_points = [5, -3, 2, 8;
-7, 4, -9, 1;
0, 10, -5, -2];
% 设置终止条件
epsilon = 1e-6;
% 设置最大迭代次数
max_iterations = 1000;
% 迭代求解
for i = 1:size(initial_points, 1)
x = initial_points(i, :)';
k = 0;
while true
gradient = grad_f(x(1), x(2), x(3), x(4));
alpha = fminsearch(@(alpha) f(x(1)-alpha*gradient(1), x(2)-alpha*gradient(2), x(3)-alpha*gradient(3), x(4)-alpha*gradient(4)), 0); % 精确搜索
x_next = x - alpha*gradient;
k = k + 1;
if norm(gradient) < epsilon || k >= max_iterations
break;
end
x = x_next;
end
fprintf('初始点: [%d, %d, %d, %d],迭代次数: %d,最优函数值: %f\n', initial_points(i, :), k, f(x(1), x(2), x(3), x(4)));
end
3. 结果
初始点: [5, -3, 2, 8],迭代次数: 1000,最优函数值: 0.000240
初始点: [-7, 4, -9, 1],迭代次数: 1000,最优函数值: 0.000000
初始点: [0, 10, -5, -2],迭代次数: 1000,最优函数值: 0.011275
四、心得体会
在这次实验中,我通过学习和编程实现了最速下降法来解决约束优化问题。通过这个过程,我深刻理解了负梯度方向的概念以及最速下降法的迭代公式。最速下降法的基本原理是通过不断沿着负梯度方向更新参数,使得目标函数值越来越小,直至达到最优解。在实现最速下降法的过程中,我发现了一些关键的因素影响了算法的收敛速度和精度。首先,步长的选择非常重要,步长过大可能导致震荡或不收敛,步长过小则会导致收敛速度很慢。其次,初始点的选择也会影响算法的性能,一个好的初始点可以加快算法的收敛速度。通过不断优化实验中的算法,我进一步巩固了最速下降法的基本原理和思想。我深刻体会到了通过不断迭代优化参数来求解约束优化问题的方法的有效性和重要性。