Matlab 中部分旋轉的高斯消元法

Ilja Kostenko 2023年1月30日
  1. 在 Matlab 中使用高斯消元法
  2. 在 Matlab 中使用旋轉作為輔助功能
Matlab 中部分旋轉的高斯消元法

本文將幫助讀者瞭解如何在 Matlab 中使用高斯消元法。

在 Matlab 中使用高斯消元法

高斯方法是求解線性代數方程 (SLA) 系統的經典方法。

這是一種順序排除變數的方法;當使用基本變換時,方程組被簡化為等價的三角形系統。

所有系統變數都按順序定位,從最後一個(按編號)開始。

Gauss-Jordan 演算法在第一步將第一行除以係數 A[1,1]

然後該演算法將第一行新增到具有這樣係數的其餘行中,使得它們在第一列中的係數變為零 - 為此,當將第一行新增到第 i 行時,有必要將其乘以 -A[i,1]

對於矩陣 A 的每個操作(除以一個數字並與另一行相加),用向量 b 執行相應的操作;從某種意義上說,它的行為就像是矩陣 A 的第 m+1 列。

結果,在第一步結束時,矩陣 A 的第一列將變為單列(即,它將在第一行包含一個,在其餘行包含零)。

同理,執行演算法的第二步;現在只考慮第二列和第二行。首先,第二行除以 A[2,2],然後從所有其他行中減去係數,例如重置矩陣 A 的第二列。

依此類推,直到我們處理矩陣 A 的所有行或列。如果 n= m,那麼從演算法的構造中可以明顯看出,矩陣 A 將變成奇異矩陣,這正是我們所需要的。

在 Matlab 中使用旋轉作為輔助功能

當然,上述方案是不完整的。它僅在每個第 i 步元素 A[i, i] 不為零時才有效 - 否則,我們將無法通過將第 i 行新增到當前列中的剩餘係數來將其歸零.

有一個選擇參考元素的過程(總而言之,旋轉)以使演算法在這種情況下工作。它包括這樣一個事實,即矩陣的行和列被重新排列,以便所需的元素 A[i, i] 具有非零數。

請注意,在計算機上,行的重排比列的重排要容易得多:畢竟,在交換某些兩列時,你需要記住這兩個變數交換了位置,以便在還原答案時,正確還原哪個 answer 屬於哪個變數。

重新排列行時,無需執行此類附加操作。

換句話說,在使用部分旋轉啟發式執行 Gauss-Jordan 演算法的第 i 階段之前,需要在索引從 i 到 n 的元素中找到第 i 列的最大模,並交換第 i 行包含此元素的行。

function x = pivot(~, ~)
% Program to Solve Ax = b using Gaussian Elimination Method with partial-
% pivoting (Row-exchange)
%==========================================================================

% OUTPUT:
%==========================================================================

% Solution vector, x

%==========================================================================
A=[1 2 3; 4 5 6];
b=[1 -2 5];
[m,n] = size(A); % checking the size of matrix


%==========================================================================
% Initialization
x = zeros(m,1);
l = zeros(m,m-1);

%==========================================================================
% Main Program
%==========================================================================

% Reducing Matrix A to upper triangular form

for k = 1:m-1
    % =========Performing Partial-pivoting=================================
        for p = k+1:m
            if (abs(A(k,k)) < abs(A(p,k)))
                A([k p],:) = A([p k],:);
                  b([k p]) = b([p k]);
            end
        end
    % =====================================================================
% =========Setting Matrix A to triangular form=================================
    for i = k+1:m
        l(i,k) = A(i,k)/A(k,k);
        for j = k+1:n
            A(i,j) = A(i,j)-l(i,k)*A(k,j);
        end
        b(i) = b(i)-l(i,k)*b(k);
    end
end

for k = 1:m-1
    for i = k+1:m
        A(i,k) = 0;
    end
end

%==========================================================================
% Backward substitution of Matrix A
%==========================================================================
x(m) = b(m)/A(m,m);

for i = m-1:-1:1
    sum = 0;
    for j = i+1:m
        sum = sum + A(i,j)*x(j);
    end
    x(i) = (b(i)- sum)/A(i,i);
end

%==========================================================================
end

輸出:

ans =

    -3
     2