天天看點

疊代法——Matlab中實作疊代法

疊代法

這裡一共提供了四種疊代法:

+ 雅可比疊代法

+ 高斯賽德疊代法

+ 超松弛疊代法(SOR)

+ 共轭疊代法

随機生成方程組

此處随機生成特征值服從獨立同分布的[0,1]間的均勻分布的A矩陣,跟服從獨立同分布的正态分布的b向量

算法設計

  • A矩陣的實作,首先需要用rand得到一組特征值,将該組特征值通過diag函數生成對角陣Q,之後通過orth函數生成對稱矩陣U,再通過UQU’即可得到對稱正定矩陣
  • b向量的實作同第一題,用randn函數即可

代碼實作:

%n代表的是次元
b = randn([n(k) ]);
Q = diag(rand([ n(k)]));
U = orth(rand([n(k) n(k)]));
           

Jacobi 疊代法函數

算法設計

  • 傳入參數為矩陣A,向量b,以及次元n
  • 傳出參數為結果與時間(or相對誤差數組),具體輸出視操作而定
  • 通過diag函數,tril函數,triu函數得到A矩陣的對角陣D,上三角矩陣U跟下三角矩陣L
  • 通過以下公式得到疊代所需的B跟f
B = D(L+U);
  f = D\b;`
           
  • 通過以下公式進行疊代:
  • 疊代終止的判斷,求出前後兩次疊代的向量差的範數,直至小于1^-6
  • 如果疊代次數超過2000,則視為發散,彈出錯誤

代碼實作:

function [x,y] = Jacobi(n, A ,b)

    %y = zeros(1000,1);
    eps = ;
    D = diag(diag(A));
    L = -tril(A, -);
    U = -triu(A, );

    B = D\(L+U);
    f = D\b;

    count = ;

    x0 = zeros(n,);
    x = B*x0 + f;

    tic;
    while norm(x-x0)> eps
        x0 = x;
        %y(count) = norm(x-A\b);
        x = B*x0 + f;
        count = count + ;
        if count > 
            disp('error:該矩陣不收斂');
            return;
        end
    end
    toc;
    y = toc;
    disp(count);
end
           

Gauss-Seidel 疊代法函數

算法設計

  • 傳入參數為矩陣A,向量b,以及次元n
  • 傳出參數為結果與時間(or相對誤差數組),具體輸出視操作而定
  • 通過diag函數,tril函數,triu函數得到A矩陣的對角陣D,上三角矩陣U跟下三角矩陣L
  • 通過以下公式得到疊代所需的B跟f
B = (D - L)\U;
    f = (D - L)\b;
           
  • 通過以下公式進行疊代:
  • 疊代終止的判斷,求出前後兩次疊代的向量差的範數,直至小于1^-6
  • 如果疊代次數超過2000,則視為發散,彈出錯誤

代碼實作:

function [x, y]= Gauss_Seidel(n, A ,b)

    %y = zeros(1000,1);
    eps = ;
    D = diag(diag(A));
    L = -tril(A, -);
    U = -triu(A, );

    B = (D - L)\U;
    f = (D - L)\b;

    count = ;
    x0 = zeros(n,);
    x = B*x0 + f;

    tic;
    while norm(x-x0) > eps

        x0 = x;
       % y(count) = norm(x-A\b);
        x = B*x0 + f;
        count = count + ;

        if count > 
            disp('error:該矩陣不收斂');
            return;
        end
    end
    toc;
    y = toc;
    disp(count);
end
           

逐次超松弛疊代法函數

算法設計

  • 傳入參數為矩陣A,向量b,以及次元n
  • 傳出參數為結果與時間(or相對誤差數組),具體輸出視操作而定
  • 通過diag函數,tril函數,triu函數得到A矩陣的對角陣D,上三角矩陣U跟下三角矩陣L
  • 通過以下公式得到疊代所需的B跟f
B = (D - w*L) \ ((-w) * D + w*U);
    f = w * inv(D - w*L) * b;
           
  • 通過以下公式進行疊代:
  • 疊代終止的判斷,求出前後兩次疊代的向量差的範數,直至小于1^-6
  • 如果疊代次數超過2000,則視為發散,彈出錯誤

代碼實作:

function [x, y] = SOR(n, A ,b, w)

    y = zeros(,);
    eps = ;
    D = diag(diag(A));
    L = -tril(A, -);
    U = -triu(A, );

    B = (D - w*L) \ ((-w) * D + w*U);
    f = w * inv(D - w*L) * b;

    count = ;

    x0 = zeros(n,);
    x = B*x0 + f;

    tic;
    while norm(x-x0) > eps

        x0 = x;
        y(count) = norm(x-A\b);
        x = B*x0 + f;
        count = count + ;

        if count > 
            disp('error:該矩陣不收斂');
            return;
        end
    end
    toc;
    y = toc;
    disp(count);
end
           

共轭梯度法函數

算法設計

  • 傳入參數為矩陣A,向量b,以及次元n
  • 傳出參數為結果與時間(or相對誤差數組),具體輸出視操作而定
  • 通過以下公式得到疊代所需的r0跟p0
r0 = b - A * x0;
    p0 = r0;
           
  • 通過以下公式進行疊代:
a = r0'r0/(p0'A*p0);
      x = x0 + a*p0;
      r = r0 - a*A*p0;
      B = r'*r/(r0'*r0);
      p = r + B*p0;
           
  • 疊代終止的判斷,求出前後兩次疊代的向量差的範數,直至小于1^-6
  • 如果疊代次數超過2000,則視為發散,彈出錯誤

代碼實作:

function [x, y] = CG(n, A , b)

    y = zeros(,);
    eps = ;
    x0 = zeros(n,);
    r0 = b - A * x0;
    p0 = r0;

    count = ;

    tic;
    while norm(p0) > eps
        a = r0'*r0/(p0'*A*p0);
        x = x0 + a*p0;
        r = r0 - a*A*p0;
        B = r'*r/(r0'*r0);
        p = r + B*p0;

        p0 = p;
        r0 = r;
        x0 = x;
       % y(count) = norm(x-A\b);
        count = count + ;

        if count > 
            disp('error:該矩陣不收斂');
            return;
        end
    end
    toc;
    y = toc;

    disp(count);
end
           

相對誤差計算

算法設計

  • 通過A\b得到近似解
  • 通過求出近似解與得到的解的差向量的範數作為相對誤差

代碼實作

具體的代碼實作,已經穿插在四種疊代法中