代码
function [xopt, fopt, iter] = grad_descent(x0, f, g, eps, alpha)
% x0: 初始搜索点
% f: 目标函数
% g: 梯度函数
% eps: 迭代收敛的精度
% alpha: 步长
iter = 1; % 迭代计数器
max_iter = 10000; % 最大迭代次数
x = x0;
while iter <= max_iter
% 计算梯度
grad = g(x);
% 计算下降方向
d = -grad;
% 计算步长
t = backtracking_line_search(x, d, f, grad, alpha);
% 更新搜索点
x1 = x + t * d;
% 计算函数变化量
df = f(x1) - f(x);
% 判断停止条件
if abs(df) < eps
xopt = x1;
fopt = f(x1);
return;
else
% 继续迭代
x = x1;
iter = iter + 1;
end
end
% 达到最大迭代次数仍未收敛
xopt = x;
fopt = f(x);
end
% 回溯线性搜索
function t = backtracking_line_search(x, d, f, grad, alpha)
c = 0.5;
rho = 0.5;
t = alpha;
while f(x+t*d) > f(x) + c*t*grad'*d
t = rho*t;
end
end
- 结果
初始点 |
迭代次数 |
最优解 |
最优值 |
[-1.2,1] |
1798 |
[-0.9995, 0.999]** |
4.0187 |
[-0.3, 1] |
3847 |
[0.9993, 0.9986]** |
3.2615 |
[1.2,1] |
1518 |
[1.0000, 1.0000] |
0 |
[1.2,-1] |
10000 |
由于步长alpha选取不当,程序未能收敛 |
不适用 |
[2, 2] |
9978 |
由于步长alpha选取不当,程序未能收敛 |
不适用 |
四、心得体会
可以发现,与实验一中的结果相比,最速下降法的迭代次数更多,但在这个问题上仍旧表现不错。同时,我们也发现,步长alpha的选取在最优值的求解过程中极其关键,在实现中需要仔细调整。最终,我们得到了代表最优解的点,以及该点对应的最优值。
标签:工程,迭代,iter,步长,实验,alpha,数学,x1,grad From: https://www.cnblogs.com/yunbianshangdadun/p/17439835.html