一篇有关最速下降法的论文,其数值结果与作图

以下是一篇关于最速下降法以及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('迭代步数')

  

图像如下:

 

 

 

posted @ 2023-01-12 16:50  来者可追2019  阅读(86)  评论(0编辑  收藏  举报