通过解方程来动态调整学习率的想法,在实际应用中可能并不实用,因为它涉及到解符号方程,这可能会非常复杂或无法解析地求解,同时会增加计算复杂度和时间,固定学习率或基于某种规则(如线搜索)调整学习率更为常见。建议探索更高级的梯度下降变体(如Adam、RMSprop等),这些算法自动调整学习率以提高收敛速度和稳定性。
function Steepest_Descent(f, x1, x2, max_iterations, alpha) %alpha:如果学习率太小,算法会收敛得非常慢;如果学习率太大,算法可能会发散或跳过最小值。
% 项目名称:最速下降法(梯度下降法)
% 更新时间:2024/09/07
% 背景:最速下降法又称梯度法,是19世纪中叶由Cauchy提出来的求多元函数极值的最早的数值方法。法国的奥古斯丁·路易斯·柯西的全集有27卷,论著有800多篇,在数学史上是仅次于欧拉的多产数学家。
% 作者:月白风清江有声
% f2 = @(x1,x2) 10 * (x2 - x1.^2).^2 + 2 * (1 - x1).^2;Steepest_Descent(f1,0,0,2,0.1)
% 梯度计算函数
grad_x = @(x, y) (f(x + eps, y) - f(x, y)) / eps;
grad_y = @(x, y) (f(x, y + eps) - f(x, y)) / eps;
% 迭代过程
for iteration = 1:max_iterations
grad = [-grad_x(x1, x2), -grad_y(x1, x2)]; % 注意梯度的负方向
x1 = x1 + alpha * grad(1); % 更新x1
x2 = x2 + alpha * grad(2); % 更新x2
fprintf('Iteration %d: x1 = %.4f, x2 = %.4f, f(x1, x2) = %.4f\n', iteration, x1, x2, f(x1, x2));
end
end
%{
function Steepest_Descent(f, x1, x2, iteration)
% 项目名称:最速下降法(梯度下降法)
% 更新时间:2024/09/07
% 背景:...(此处省略背景描述)
% 作者:月白风清江有声
n=0; %用来显示初始点,无意义
fprintf('Iteration %d: x1 = %.4f, x2 = %.4f, f(x1, x2) = %.4f\n', n, x1, x2, f(x1, x2));
%nabla(f(a,b))=[diff(f(a,b),a,1);diff(f(a,b),b,1)]; 这样计算diff返回值不能再次处理
grad_x = @(x, y) (f(x + eps, y) - f(x, y)) / eps; % 数值计算x的偏导数
grad_y = @(x, y) (f(x, y + eps) - f(x, y)) / eps; % 数值计算y的偏导数
for i=1:iteration %这里只能用i,iteration参数在函数内部被用作循环变量并被覆盖
syms a; %设置变量,不能设成alpha,会与diff函数内的alpha重复
grad = [grad_x(x1, x2), grad_y(x1, x2)]; % 计算当前点的梯度
g=@(a)f(x1 - a * grad(1),x2 - a * grad(2));
df=diff(g,a,1); %对a求导
sol = solve(df == 0); %符号计算返回的 sol 可能不是一个数值解,而是一个符号解
x1 = x1 - double(sol)* grad(1); % 更新x1
x2 = x2 - double(sol)* grad(2); % 更新x2
fprintf('Iteration %d: x1 = %.4f, x2 = %.4f, f(x1, x2) = %.4f\n', iteration, x1, x2, f(x1, x2));
end
end
%}
%题目要求:
% f1=@(x1,x2)x1.^2-2*x1*x2+2*x2.^2+x1-3*x2
% f2 = @(x1,x2) 10 * (x2 - x1.^2).^2 + 2 * (1 - x1).^2;(无法解决,要设置固定学习率替换a)
% x1=0;x2=0;d2=(1,0)'
%手算结果:
% nabla1=[2*x1-2*x2+1;-2*x1+4*x2-3]
% nabla2=[-40*x1*(x2-x1.^2)+4*x1-4;20*(x2-x1.^2)]
% Steepest_Descent(f1,0,0,2)