最速下降法步长,关于最速下降法的步长求法

最速下降法中[r^(k)]^Tr^(k+1)=0,为什么

最速下降法步长,关于最速下降法的步长求法

文章插图
最速下降法以负梯度方向为搜索方向 , 每次迭代都沿着负梯度方向进行一维搜索 。
原目标函数是关于步长的一维函数 , 由极值条件可得最优步长 , 从而有结论:最速下降法中相邻两个搜索方向互相正交 。这就是上述式子 。
最速下降法求解,用matlb做 , 但是不能直接用里面的函数 , 里面的epsilon是终止误差 , 不是步长 , 谢谢~
最速下降法步长,关于最速下降法的步长求法

文章插图
% 预分配数组空间提高效率
x1 = zeros(1,10000); x2 = zeros(1,10000);
fval = zeros(1, 10000);
% x1,x2的初始值
【最速下降法步长,关于最速下降法的步长求法】x1(1) = 4; x2(1) = 4;
% 计算f初值
fval(1) = 2*x1(1)^2+0.3*x2(1)^2;
% 步长控制
step = 0.1;
% 精度控制
epsilon = 0.01;
i = 2; % 迭代计数
while 1
dir1 = 4*x1(i-1); % f对x1的偏导数
dir2 = 0.6*x2(i-1); % f对x2的偏导数
dir = sqrt(dir1^2+dir2^2); % 梯度向量的模
if (dir < 1) % 在梯度向量的模较小时 , 不再归一化以提高精度
dir = 1;
end;
x1(i) = x1(i-1)-step*dir1/dir; % 新的x1
x2(i) = x2(i-1)-step*dir2/dir; % 新的x2
fval(i) = 2*x1(i)^2+0.3*x2(i)^2;
if(abs(fval(i) - fval(i-1)) < epsilon)
break;
end;
i=i+1;
end;
x1 = x1(1:i-1);
x2 = x2(1:i-1);
fval = fval(1:i-1);
% 可视化
X=-5:0.05:5;
Y=-5:0.05:5;
[X,Y] = meshgrid(X,Y);
Z = 2*X.^2+0.3*Y.^2;
surf(X,Y,Z);
shading interp
hold on;
plot3(x1, x2, fval, 'linewidth', 2, 'color', 'black');
hold off;
xlabel('x_1', 'fontsize', 16);
ylabel('x_2', 'fontsize', 16);
set(gca, 'fontsize', 12);
你那有最速下降法的MATLAB程序吗?给我一份 , 谢谢
最速下降法步长,关于最速下降法的步长求法

文章插图
function y = minSpeed2(functions,var,x0,a,stepNum)
%functions is a function of var,for example
%x = [x1,x2,x3,x4]
y = x*x.';
%var is a variable array like [x1,x2,x3,...]
%you shouldn't like [a,b,c,d,...] or other kinds.
%x0:起始迭代值a:迭代步长
VF = jacobian(functions,var);
x = zeros([1001,length(x0)]);
x(1,:) = x0;
for k=1:stepNum
x(k+1,:) = x(k,:) - a*double(
vpa( subs(VF,var(1:end),x(k,:)) )
);
end;
if length(x0)==2
plot(x(1:k,1),x(1:k,2),'o-');grid on;
end;
if length(x0)==3
plot3(x(1:k,1),x(1:k,2),x(1:k,3),'o-');grid on;
end;
disp(x(stepNum,:));
y = x(stepNum,:);
调用格式:
clc,clear all;
syms x1 x2;
fg = (x1-5).^2+(x2+4).^2;
minSpeed2(fg,[x1 x2],[1 -2],0.01,300)
关于最速下降法的步长求法
最速下降法步长,关于最速下降法的步长求法

文章插图
1、最速下降法 , 顾名思义 , 最快的速度找到下一个较小点 , 每一次搜索都是沿着负梯度方向 , 负梯度方向就是函数值减小的方向 , 所以每一次迭代得到的函数值必然小于上一个函数值 。
2、形象地用图形描述 , 假如目标函数是一个同心圆弧 , 在初始点向负梯度方向搜索(即向圆弧内侧搜索) , 在该方向上会穿越很多条同心圆弧(即相交) , 在这个方向继续搜索 , 只有当该方向射线与某一圆弧相切时 , 才找到在这个搜索方向最内侧的圆弧 , 而相切就是令函数在该点的一阶导数为0 。至于为什么要搜索到这点才终止 , 应该是可以使每一步迭代效果最大 。