一篇有关最速下降法的论文,其数值结果与作图
以下是一篇关于最速下降法以及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