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