MATLAB 高斯消元法求解线性方程组

clear;
clc;

A=[10 -7 0 1;-3 2.099999 6 2;5 -1 5 -1;2 1 0 2]; %定义系数矩阵A
b=[8;5.900001;5;1]; %定义常数向量b
[n,n] = size(A); %获取矩阵A的维度,n表示行数和列数都为n

x = zeros(n,1); %初始化解向量x,每个分量初始值为0
P = [1:n]; %初始化置换向量P,表示行的排列顺序为1~n
Aug = [A,b]; %构造增广矩阵,即把常数向量b加到系数矩阵A的右侧

for k = 1:n-1 %循环n-1次,每次消元一个未知量
    [piv,r] = max(abs(Aug(k:n,k))); %找出主元所在行r和主元的值piv
    r = r + k - 1; %将子矩阵中的行号r转换为大矩阵中的行号
    if r>k %如果主元所在行不是第k行,进行行交换
        Aug([k,r],:)=Aug([r,k],:); %交换增广矩阵中第k行和第r行的元素
        P([k,r])=P([r,k]); %更新置换向量P
    end
    if Aug(k,k)==0 %如果主元为0,无法进行消元,报错
        error('对角元出现0');
    end
    % 把增广矩阵消元成为上三角
    for p = k+1:n %循环进行消元
        Aug(p,:)=Aug(p,:)-Aug(k,:)*Aug(p,k)/Aug(k,k); %消元操作
    end
end

% 解上三角方程组
A = Aug(:,1:n); %提取出消元后的系数矩阵
b = Aug(:,n+1); %提取出消元后的常数向量
x(n) = b(n)/A(n,n); %计算出最后一个未知量x_n
for k = n-1:-1:1 %循环逆推出x_1~x_{n-1}
    x(k) = (b(k)-A(k,n:-1:k+1)*x(n:-1:k+1))/A(k,k); %逆推计算未知量
end
P %输出置换向量P
x %输出解向量x
detA=det(A) %计算系数矩阵A的行列式值,即方程组的解是否唯一,如果为0则表示无解或多解

代码逐句解析

  1. clear; % 清空命令窗口
  2. clc; % 清空命令窗口中的内容
  3. A=[10 -7 0 1;-3 2.099999 6 2;5 -1 5 -1;2 1 0 2]; % 定义系数矩阵A
  4. b=[8;5.900001;5;1]; % 定义常数向量b
  5. [n,n] = size(A); % 获取矩阵A的维度,n表示行数和列数都为n
  6. x = zeros(n,1); % 初始化解向量x,每个分量初始值为0
  7. P = [1:n]; % 初始化置换向量P,表示行的排列顺序为1~n
  8. Aug = [A,b]; % 构造增广矩阵,即把常数向量b加到系数矩阵A的右侧
  9. for k = 1:n-1 % 循环n-1次,每次消元一个未知量
  10. [piv,r] = max(abs(Aug(k:n,k))); % 找出主元所在行r和主元的值piv
  11. r = r + k - 1; % 将子矩阵中的行号r转换为大矩阵中的行号
  12. if r>k % 如果主元所在行不是第k行,进行行交换
  13. Aug([k,r],:)=Aug([r,k],:); % 交换增广矩阵中第k行和第r行的元素
  14. P([k,r])=P([r,k]); % 更新置换向量P
  15. end
  16. if Aug(k,k)==0 % 如果主元为0,无法进行消元,报错
  17. error('对角元出现0');
  18. end
  19. for p = k+1:n % 循环进行消元
  20. Aug(p,:)=Aug(p,:)-Aug(k,:)*Aug(p,k)/Aug(k,k); % 消元操作
  21. end
  22. end
  23. A = Aug(:,1:n); % 提取出消元后的系数矩阵
  24. b = Aug(:,n+1); % 提取出消元后的常数向量
  25. x(n) = b(n)/A(n,n); % 计算出最后一个未知量x_n
  26. for k = n-1:-1:1 % 循环逆推出x_1~x_{n-1}
  27. x(k) = (b(k)-A(k,n:-1:k+1)*x(n:-1:k+1))/A(k,k); % 逆推计算未知量
  28. end
  29. P % 输出置换向量P
  30. x % 输出解向量x
  31. detA=det(A) % 计算系数矩阵A的行列式值,即方程组的解是否唯一,如果为0则表示无解或多解

代码说明

该代码使用高斯消元法求解线性方程组,其核心思想是将增广矩阵通过初等行变换化为上三角矩阵,然后通过回代法求解未知量。代码中,Aug 矩阵存储了增广矩阵,P 向量存储了行交换信息,x 向量存储了解向量。

总结

该代码展示了使用 MATLAB 实现高斯消元法求解线性方程组的步骤,并对代码进行了逐句解析,方便读者理解。高斯消元法是一种常用的线性方程组求解方法,它在数值计算中具有广泛的应用。

注意事项

  1. 如果系数矩阵的行列式为0,则方程组无解或多解,代码会报错。
  2. 代码中的 max(abs(Aug(k:n,k))) 是为了找到主元,如果主元为0,则无法进行消元,代码会报错。
  3. 代码中使用 error('对角元出现0'); 来处理主元为0的情况,可以根据实际情况进行修改。
  4. 代码中使用 det(A) 计算系数矩阵的行列式值,可以通过行列式值判断方程组的解是否唯一。

希望以上内容能够帮助您理解高斯消元法和 MATLAB 代码。如果您还有其他问题,请随时提出。

MATLAB 高斯消元法求解线性方程组

原文地址: http://www.cveoy.top/t/topic/blud 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录