最陡下降以找到具有希尔伯特矩阵的线性系统的解

时间:2016-10-06 02:49:47

标签: matlab optimization mathematical-optimization numerical-methods gradient-descent

我正在使用最速下降的方法来找出具有5x5希尔伯特矩阵的线性系统的解决方案。我相信代码很好,因为它给了我正确的答案。

我的问题是:

  1. 我认为这需要太多的迭代才能得到正确的答案。我相信我可能错过了算法中的一些内容,但我不确定此时的内容。

  2. 我不确定这是否是实施该算法最有效的方法,另外,它有点令人困惑,其中" tol"选择。

  3. 对此有任何见解(尤其是1.)。谢谢!

    % Method of Steepest Descent with tol 10^-6
    h = hilb(5);                            %Hilbert 5x5 matrix
    b = [1;1;1;1;1];                        %solution matrix
    solution = zeros(d,1);                  %Initialization 
    residual = h*solution - b;
    tol = 10^(-6)
    count = 0; 
    
    while residual'*residual > tol;
        roe = (residual'*residual)/(residual'*h*residual);
        solution = solution - roe*residual;
        residual = h*solution - b;
        count = count + 1;
    end
    
    count 
    solution 
    
    
    %Method of Steepest Descent with tol 10^-12
    solution = zeros(d,1);
    residual = h*solution - b;
    tol = 10^(-12)
    count = 0; 
    
    while residual'*residual > tol;
        roe = (residual'*residual)/(residual'*h*residual);
        solution = solution - roe*residual;
        residual = residual - roe*h*residual;
        count = count + 1;
    end
    
    count
    solution
    
    %another_solution = invhilb(5)*b           %Check for solution
    

2 个答案:

答案 0 :(得分:2)

看起来你正确地实现了算法(最陡的下降/梯度下降与精确的线搜索,以最小化凸二次函数)。

融合很慢,因为问题是病态:您考虑的Hilbert矩阵的条件数超过400000.当问题病态时,已知梯度下降很慢。

考虑到一个条件良好的问题,例如通过将身份添加到希尔伯特矩阵(h = hilb(5)+ eye(5)),相同的代码仅在7次迭代后终止(并且该条件编号为矩阵小于3)。

答案 1 :(得分:1)

我没有从数学方面处理你的问题的知识,但从编程的角度来看,有一点我可以注意到。

确实你是对的。在得到结果之前需要进行太多次迭代:

Elapsed time is 6.487824 seconds.

count =

      292945

当您定义步长以接近最终结果时,必须优化步长。否则你要么接近答案要么太慢,要么你已经多次通过最佳答案并且因为你的步长太大而在它周围做一个曲折。

为了优化步长,我首先根据你的脚本形成一个函数(加上一些小修改):

function [solution, count, T] = SDhilb(d, step)
h = hilb(d);
tic
b = ones(d, 1);
solution = zeros(d, 1);
residual = h * solution - b;
res2 = residual' * residual;
tol = 10^(-6);
count = 0;
while res2 > tol;
    roe = res2/(residual' * h * residual);
    solution = solution - step * roe * residual; % here the step size appears
    residual = h * solution - b;
    count = count + 1;
    res2 = residual' * residual; % let's calculate this once per iteration
end
T = toc;

现在将此函数用于一系列步长(0.1:0.1:1.3)和一对希尔伯特矩阵(d = 2,3,4,5),显然1不是一个有效的步骤尺寸:

enter image description here

相反,step = 0.9似乎效率更高。让我们看看hilb(5)

的效率
[result, count, T] = SDhilb(5, 0.9)

result =

    3.1894
  -85.7689
  481.4906
 -894.8742
  519.5830


count =

        1633


T =

    0.0204

速度提高了两个数量级以上。

以类似的方式,您可以尝试使用tol的不同值来查看它对速度的影响程度。在这种情况下,没有最佳值:公差越小,您需要等待的时间就越长。