最速下降法
通过最速下降法的程序设计,为今后的约束优化方法的学习和编程奠定基础;掌握负梯度方向的定义和最速下降法的迭代公式 ;通过此次实验,进一步巩固最速下降法的基本原理和思想。
(1)求解无约束优化问题: ;
(2)终止准则取 ;
(3)完成最速下降法(负梯度法)的MATLAB编程、调试;
(4)要求选取多个不同的初始点,并给出迭代次数,最优函数值等相关信息,有能力的同学尝试画出最优值随迭代次数变化的曲线图;
1. 算法步骤
首先定义目标函数f,设置不同的初始点和最大迭代次数和精度要求。接着进行循环,每次取出一个初始点x0,并把迭代点x初始化为它。同时设定步长a和梯度的范数grad_norm的初始值为正无穷。
迭代循环:每次计算目标函数的梯度grad,并根据负梯度方向计算下一个迭代点x_new。如果新的目标函数值f(x_new)比当前点f(x)更小,说明朝着正确的方向移动了,可以加大步长;否则说明步长过大会跳过最优点,需要缩小步长。最后更新梯度的范数grad_norm,如果达到精度要求或超过最大迭代次数就退出循环。
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