一篇有关最速下降法的论文,其数值结果与作图
以下是一篇关于最速下降法以及BB方法的论文
https://maiimg.com/dec/a197486735131674@pdf
我给出了提到的三种方法的Matlab程序:
clear
format long
A = diag([20, 10, 2, 1],0); b = [1; 1; 1; 1];
% f(x)=1/2x'*A*x-b'*x,梯度=A*x-b,海瑟矩阵=A
x = zeros(4, 1000); g = zeros(4, 1000); Table = zeros(1000, 3); % 用于记录每一步迭代点x_k、下降方向g_k以及论文中对应的表格
% Table中第一列为下降方向的2-范数,第二列为步长,第三列为前后步长2-范数平方的比值。
%% 最速下降法
x(:, 1) = [0; 0; 0; 0]; % 初始点(0,0,0,0)
% 第一次迭代 k=1
k = 1;
g(:, 1) = -b; alpha = (g(:, 1)'*g(:, 1))/(g(:,1)'*A*g(:, 1)); % 计算下降方向与步长
x(:, 2) = x(:, 1)-alpha*g(:,1); % 第二个迭代点
Table(1, 1) = norm(g(:, 1), 2); Table(1, 2) = alpha; % 更新表格
% 第二次迭代以后
while norm(Table(k, 1),2) >= 10^(-8)
k = k+1;
g(:, k) = A * x(:, k) - b; alpha = (g(:, k)'*g(:, k)) / (g(:, k)' * A * g(:, k)); % 计算第k步的下降方向与步长
x(:, k+1) = x(:, k) - alpha * g(:, k); % 第k+1个迭代点
% 更新表格
Table(k, 1) = norm(g(:, k), 2);
Table(k, 2) = alpha;
Table(k-1, 3) = Table(k, 1)^2 / Table(k-1, 1)^2;
end
Table(k, 3) = (A * x(:, k+1) - b)' * (A * x(:, k+1) - b) / Table(k, 1)^2;
% 利用最速下降法得到的迭代点、下降方向以及论文中对应表格
x_steepestDescent = x(:, 1:k+1);
g_steepestDescent = g(:, 1:k);
Table_steepestDescent = Table(1:k, :);
F_steepestDescent = diag( 1/2 * x_steepestDescent' * A * x_steepestDescent - x_steepestDescent' * b );
%% BB方法1
x = zeros(4, 1000); g = zeros(4, 1000); Table = zeros(1000, 3); % 重制
x(:, 1) = [0; 0; 0; 0]; x(:, 2) = x(:, 1); % 头两个迭代点均为(0,0,0,0)
% 第二次迭代
k = 2;
g(:, 1) = -b; g(: ,2) = -b; alpha = 1; % 下降方向与步长
x(:, 3) = x(:, 2) - alpha * g(:, 2); % 第三个迭代点
Table(2, 1) = norm(g, 2); Table(2, 2) = alpha; % 更新表格
% 第三次迭代以后
while norm(Table(k, 1), 2) >= 10^(-8)
k = k+1;
g(:, k) = A * x(:, k) - b; % 第k步的下降方向
delta_x = x(:, k) - x(:, k-1); delta_g = g(:, k) - g(:, k-1);
alpha = (delta_x' * delta_g) / (delta_g' * delta_g); % 第k步的步长
x(:, k+1) = x(:, k) - alpha * g(:, k); % 第k+1个迭代点
% 更新表格
Table(k, 1) = norm(g(:, k), 2);
Table(k, 2) = alpha;
Table(k-1, 3) = Table(k, 1)^2 / Table(k-1, 1)^2;
end
Table(k, 3) = (A*x(:, k+1) - b)' * (A * x(:, k+1) - b) / Table(k, 1)^2;
% 利用BB1得到的迭代点、下降方向以及论文中对应表格
x_BB1 = x(:, 1:k+1);
g_BB1 = g(:, 1:k);
Table_BB1 = Table(1:k, :);
F_BB1 = diag( 1/2 * x_BB1' * A * x_BB1 - x_BB1' * b );
%% BB方法2
x = zeros(4, 1000); g = zeros(4, 1000); Table = zeros(1000, 3); % 重制
x(:, 1) = [0; 0; 0; 0]; x(:, 2) = x(:, 1); % 头两个迭代点均为(0,0,0,0)
% 第二次迭代
k = 2;
g(:, 1) = -b; g(: ,2) = -b; alpha = 1; % 下降方向与步长
x(:, 3) = x(:, 2) - alpha * g(:, 2); % 第三个迭代点
Table(2, 1) = norm(g, 2); Table(2, 2) = alpha; % 更新表格
% 第三次迭代以后
while norm(Table(k, 1), 2) >= 10^(-8)
k = k+1;
g(:, k) = A * x(:, k) - b; % 第k步的下降方向
delta_x = x(:, k) - x(:, k-1); delta_g = g(:, k) - g(:, k-1);
alpha = (delta_x' * delta_x) / (delta_x' * delta_g); % 第k步的步长
x(:, k+1) = x(:, k) - alpha * g(:, k); % 第k+1个迭代点
% 更新表格
Table(k, 1) = norm(g(:, k), 2);
Table(k, 2) = alpha;
Table(k-1, 3) = Table(k, 1)^2 / Table(k-1, 1)^2;
end
Table(k, 3) = (A*x(:, k+1) - b)' * (A * x(:, k+1) - b) / Table(k, 1)^2;
% 利用BB1得到的迭代点、下降方向以及论文中对应表格
x_BB2 = x(:, 1:k+1);
g_BB2 = g(:, 1:k);
Table_BB2 = Table(1:k, :);
F_BB2 = diag( 1/2 * x_BB2' * A * x_BB2 - x_BB2' * b );
数值结果放在如下文件:
https://maiimg.com/dec/a144166735129857@pdf
图像处理的Matlab程序:
semilogy(1:183,F_steepestDescent(1:183)'+0.825*ones(1,183))
hold on ;
semilogy(1:28,F_BB1(1:28)'+0.825*ones(1,28),'-+')
hold on ;
semilogy(1:27,F_BB2(1:27)'+0.825*ones(1,27),'--')
legend('经典最速下降','BB1','BB2')
ylabel('函数值(经过处理)')
xlabel('迭代步数')
semilogy(1:183,Table_steepestDescent(1:183,1))
hold on ;
semilogy(1:27,Table_BB1(1:27,1)','-+')
hold on ;
semilogy(1:26,Table_BB2(1:26,1)','-*')
legend('经典最速下降','BB1','BB2')
ylabel('梯度2-范数')
xlabel('迭代步数')
图像如下:


本文来自博客园,作者:来者可追2019,转载请注明原文链接:https://www.cnblogs.com/wjma2719/p/17047065.html

浙公网安备 33010602011771号