实验一 解线性方程组的高斯消去法与高斯列主元消去法Matlab实现

【作业内容】:解线性方程组:
[ 3.01 6.03 1.96 1.348 6.65 0.002 1.47 − 4.81 9.34 ] ∗ [ x 1 x 2 x 3 ] = [ 11 8 6 ] \left[\begin{matrix}3.01 & 6.03 & 1.96\\1.348 & 6.65 & 0.002\\ 1.47 & -4.81 & 9.34\\ \end{matrix}\right]*\left[\begin{matrix}x_{1}\\x_{2}\\ x_{3}\\ \end{matrix}\right]= \left[\begin{matrix}11\\8\\ 6\\ \end{matrix}\right] 3.011.3481.476.036.654.811.960.0029.34x1x2x3=1186

  1. 高斯消去法

    用高斯消去法求解上述方程组,输出消元过程以及 A x = b Ax=b Ax=b中矩阵 A A A b b b、解向量 x x x d e t A detA detA

  2. 高斯列主元消去法

    用高斯列主元消去法求解上述方程组,输出列主元选取消元过程,包括行交换次序 A x = b Ax=b Ax=b中矩阵 A A A b b b、解向量 x x x d e t A detA detA

  3. 比较两种消去法. 用MATLAB的内部函数 i n v inv inv求出系数矩阵的逆矩阵,再输入命令 x = i n v ( A ) ∗ b x=inv(A)*b x=inv(A)b, 即可求出上述两个方程组的解。并与高斯消去法、高斯列主元消去法求出的解进行比较,体会选主元的方法具有良好的数值稳定性。

说明:计算过程保留小数点以后8位数字

高斯消去法

  • matlab代码如下
% Gauss.m
% 高斯法求解线性方程组Ax=b
% A为输入矩阵系数,b为方程组右端系数
% 方程组的解保存在x变量中
% 先输入方程系数

% 设置计算过程的默认精度
digits(9);

A = vpa([3.01,6.03,1.96; 1.348,6.65,0.002; 1.47, -4.81,9.34])
disp('detA=')
disp(det(A))
b = [11,8,6]'
[m,n]=size(A);
%检查系数正确性
if m~=n
    error('矩阵A的行数和列数必须相同');
    return;
end
if m~=size(b)
    error('b的大小必须和A的行数或A的列数相同');
    return;
end
%再检查方程是否存在唯一解
if rank(A)~=rank([A,b])
    error('A矩阵的秩和增广矩阵的秩不相同,方程不存在唯一解');
    return;
end

%这里采用增广矩阵行变换的方式求解
c=n+1;
A(:,c)=b; 


%高斯消元,输出消元过程
disp('高斯消元:');
for k=1:n-1
    A(k+1:n, k:c) = A(k+1:n, k:c)-(A(k+1:n,k)/ A(k,k))*A(k, k:c)
end

%%回代结果
x=zeros(length(b),1);  
x(n)=A(n,c)/A(n,n);
for k=n-1:-1:1
x(k)=(A(k,c)-A(k,k+1:n)*x(k+1:n))/A(k,k);
end

%显示计算结果
disp('x=');
disp(x);

高斯列主元消去法

  • matlab代码如下
% Column_Gauss.m
% 高斯法求解线性方程组Ax=b
% A为输入矩阵系数,b为方程组右端系数
% 方程组的解保存在x变量中
% 先输入方程系数

% 设置计算过程的默认精度
digits(9);
A = vpa([3.01,6.03,1.96; 1.348,6.65,0.002; 1.47, -4.81,9.34])
disp('detA=')
disp(det(A))
b = [11,8,6]'
[m,n]=size(A);

%检查系数正确性
if m~=n
    error('矩阵A的行数和列数必须相同');
    return;
end
if m~=size(b)
    error('b的大小必须和A的行数或A的列数相同');
    return;
end
%再检查方程是否存在唯一解
if rank(A)~=rank([A,b])
    error('A矩阵的秩和增广矩阵的秩不相同,方程不存在唯一解');
    return;
end

%这里采用增广矩阵行变换的方式求解
c=n+1;
A(:,c)=b; 

for i=1:n
    disp(['第',num2str(i),'次交换列主元前:'])
    disp(A);
    [max_col,position_to_i]= max(abs(A(i:end,i)));%只考虑i后的行列,选取绝对值较大的作为主元
    if max_col == 0
       error('主对角元是0,无唯一解,无法用高斯主列消元法解');
    end
    %交换最大元列 的行
    max_col_rowposition = position_to_i+i-1;%列中的实际位置..
    if max_col_rowposition ~= i
        temp = A(i,:);
        A(i,:) = A(max_col_rowposition,:);
        A(max_col_rowposition,:) = temp;
    end
    disp(['第',num2str(i),'次交换列主元后:'])
    disp(A);
    for j = (i+1):n
        A(j,:) = A(j,:) - A(j,i) / A(i,i) * A(i,:);
    end
    disp(['第',num2str(i),'次消元后:'])
    disp(A);
    
end


%%回代结果
x=zeros(length(b),1);  
x(n)=A(n,c)/A(n,n);
for k=n-1:-1:1
    x(k)=(A(k,c)-A(k,k+1:n)*x(k+1:n))/A(k,k);
end

%显示计算结果
disp('x=');
disp(x);

Matlab逆矩阵求解

A = [3.01,6.03,1.96; 1.348,6.65,0.002; 1.47, -4.81,9.34];
b = [11,8,6]';
x = inv(A)*b;
disp(x);

你可能感兴趣的:(计算方法实验)