【数值分析】高斯消元法,matlab实现

高斯消元法

A n × n x = b A_{n \times n}x=b An×nx=b
步骤:
1. 列出增广矩阵 Z = [ A ∣ b ] 2. 迭代    ,    j = 1 , 2 , ⋯   , n Z 第 i 行的每个元素乘以 Z i − 1 , j Z i , j    ,    i = j + 1 , j + 2 , ⋯   , n Z 第 i 行减去第 j 行    ,    消元 3. 回代 x i = b i − ∑ j = i + 1 n x j ⋅ A i , j A i , i    ,    i = n , n − 1 , ⋯   , 1 \begin{align*} 1.& 列出增广矩阵Z=[A|b] \\ \\ 2.& 迭代 \,\,,\,\, j=1,2, \cdots ,n \\ \\ & Z第i行的每个元素乘以 \frac{Z_{i-1,j}}{Z_{i,j}} \,\,,\,\, i=j+1,j+2, \cdots ,n \\ \\ &Z第i行减去第j行 \,\,,\,\, 消元 \\ \\ 3. & 回代 \\ \\ &x_i= \frac{b_i- \sum_{j=i+1}^{ n}x_j \cdot A_{i,j}}{A_{i,i}} \,\,,\,\, i=n,n-1, \cdots ,1 \end{align*} 1.2.3.列出增广矩阵Z=[Ab]迭代,j=1,2,,nZi行的每个元素乘以Zi,jZi1,j,i=j+1,j+2,,nZi行减去第j,消元回代xi=Ai,ibij=i+1nxjAi,j,i=n,n1,,1
不选主元的高斯消元法
matlab实现

%% Ax=b例子
A = [16 -12 2 4;
    12 -8 6 10;
    3 -13 9 23;
    -6 14 1 -28];
b = [17 36 -49 -54]';
[x,A,b] = gaussElim(A,b)

%% 不选主元高斯消元法解 Ax=b 傻逼版
% 输入矩阵A
% 输出解向量x, 消元后的矩阵A,b
function [x, A, b] = gaussElim(A,b)
    Z = [A b]
    [n,m] = size(Z)
    for j=1:m
        for i=j+1:n
            Z(i,[1:end])=Z(i,[1:end]).* (Z(i-1,j)/Z(i,j)); % 乘数
        end
        for i=j+1:n
            Z(i,[1:end])=Z(i,[1:end])-Z(j,[1:end]); % 消元
        end
    end
    A = Z([1:n],[1:m-1]);
    b = Z([1:n],m);
    for i=n:-1:1 % 回代
        x(i) = b(i);
        for j=n:-1:i+1
            x(i) = x(i)-A(i,j)*x(j);
        end
        x(i) = x(i)/A(i,i);
    end
    x=x';
end

列主元高斯消元法
选每列模最大的元素作为主元,即被除数。
matlab实现

%% 选主元高斯消元法解 Ax=b 傻逼版
% 输入矩阵A
% 输出解向量x, 消元后的矩阵A,b
function [x, A, b] = gaussElim(A,b)
    Z = [A b]
    [n,m] = size(Z)
    for j=1:n
        max = 0; % 选主元
        for i=j:n
            if abs(Z(i,j))>max
                max=abs(Z(i,j))
                maxi = i
            end
        end
        t = Z(j,[1:end]);
        Z(j,[1:end])=Z(maxi,[1:end]);
        Z(maxi,[1:end])=t;
        
        for i=j+1:n
            Z(i,[1:end])=Z(i,[1:end]).* (Z(i-1,j)/Z(i,j)) % 乘数
        end
        for i=j+1:n
            Z(i,[1:end])=Z(i,[1:end])-Z(j,[1:end]) % 消元
        end
    end
    A = Z([1:n],[1:m-1]);
    b = Z([1:n],m);
    for i=n:-1:1 % 回代
        x(i) = b(i);
        for j=n:-1:i+1
            x(i) = x(i)-A(i,j)*x(j);
        end
        x(i) = x(i)/A(i,i);
    end
    x=x';
end

你可能感兴趣的:(数值分析,matlab,线性代数,高斯消元法,列主元高斯消元法,数值分析)