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


    高斯消元法的基本原理是通过一系列行变换将线性方程组的增广矩阵转化为简化行阶梯形式,从而得到方程组的解。其核心思想是利用矩阵的行变换操作,逐步消除未知数的系数,使得方程组的求解变得更加简单。

    首先,给定系数矩阵A和常数向量b,将它们合并为增广矩阵a。然后确定增广矩阵的行数n和列数m。

    接下来,使用两个嵌套的循环,依次进行消元计算。外层循环i从1到n遍历每一行,内层循环j从m递减到i遍历当前行的每个元素。在每次循环中,将当前行的第j个元素除以第i个元素,即将主元归一化为1。

    然后,通过两个嵌套的循环,对i+1到n的行进行消元计算。内层循环k从m递减到i遍历当前行的每个元素,将当前行的第k个元素减去第j行的第i个元素乘以第i行的第k个元素,即利用消元操作将当前列的下面各行的对应元素都消为0。

    然后,使用一个逆序的循环,从第n-1行开始回代求解未知数。在每次循环中,内层循环j从i递减到1,将当前行的最后一个元素减去第i+1行的第m个元素乘以第j行的第m个元素,即通过回代操作求解未知数。

    实际上就是两个三层循环,消元一个三层循环和回代一个三层循环,即算法的复杂度为O(n3)。

    1. A=[1,1,2,1;1,2,0,1;1,4,2,1;1,8,2,4];
    2. b=[2;0;2;3];
    3. A_b=[A,b];
    4. [n,m]=size(A_b);
    5. for i=1:n
    6. for j=m:-1:i
    7. A_b(i,j)=A_b(i,j)/A_b(i,i);
    8. end
    9. for j=i+1:n
    10. for k=m:-1:i
    11. A_b(j,k)=A_b(j,k)-A_b(j,i)*A_b(i,k);
    12. end
    13. end
    14. fprintf('第%d次消元\n',i);
    15. disp(rats(A_b));
    16. end
    17. for i=n-1:-1:1
    18. for j=i:-1:1
    19. A_b(j,m)=A_b(j,m)-A_b(j,i+1)*A_b(i+1,m);
    20. A_b(j,i+1)=0;
    21. end
    22. fprintf('第%d次回代\n',n-i);
    23. disp(rats(A_b));
    24. end

    在高斯消去法中,如果一个列中的主元很小,那么在后续的计算过程中,将会产生较大的误差。这是因为在消元过程中,除法运算会引入数值误差,而被除数过小可能导致舍入误差放大。

    通过进行列主元选取,即选择当前列中绝对值最大的元素所在的行作为主元行,可以有效地避免除数过小的情况。选择绝对值最大的元素作为主元,能够减小舍入误差的累积,从而提高计算过程的稳定性。它可以减少舍入误差对计算结果的影响,保证所得到的解更加精确和可靠。

    1. % A=[1,1,2,1;1,2,0,1;1,4,2,1;1,8,2,4];
    2. % B=[0.0001,1,2,1;1,2,0,1;1,4,2,1;1,8,2,0.0004];
    3. % b=[2;0;2;3];
    4. A_b=[A,b];
    5. [n,m]=size(A_b);
    6. for i=1:n
    7. [~,maxIndex]=max(abs(A_b(i:n,i:i)));
    8. maxIndex=i+maxIndex-1;
    9. if i~=maxIndex
    10. A_b([i,maxIndex],:)=A_b([maxIndex,i],:);
    11. end
    12. for j=m:-1:i
    13. A_b(i,j)=A_b(i,j)/A_b(i,i);
    14. end
    15. for j=i+1:n
    16. for k=m:-1:i
    17. A_b(j,k)=A_b(j,k)-A_b(j,i)*A_b(i,k);
    18. end
    19. end
    20. fprintf('第%d次消元\n',i);
    21. disp(rats(A_b));
    22. end
    23. for i=n-1:-1:1
    24. for j=i:-1:1
    25. A_b(j,m)=A_b(j,m)-A_b(j,i+1)*A_b(i+1,m);
    26. A_b(j,i+1)=0;
    27. end
    28. fprintf('第%d次回代\n',n-i);
    29. disp(rats(A_b));
    30. end
    31. x=A_b(:,end:end);
    32. fprintf('高斯列主元消去法\n');
    33. disp(rats(x));
    34. fprintf('matlab内置函数求逆求解\n');
    35. xx=A^(-1)*b;
    36. disp(rats(xx));
    37. diff=x-xx;
    38. stem(1:100,diff);

    与matlab内置求逆的解相比 

  • 相关阅读:
    领域事件和集成事件没那么高大上
    提前尝鲜,Android 13首个Beta发布
    【Redis】深入探索 Redis 的哨兵(Sentinel)机制原理,基于 Docker 模拟搭建 Redis 主从结构和哨兵分布式架构
    Linux Ubuntu 22.04常用系统快捷键
    慧差\畸变 zemax示例
    vue2结合electron开发桌面端应用
    从传统到智能 | 拓世法宝AI智能直播一体机为商家注入活力
    Hive学习笔记(3)——DML数据操作
    Use nvidia card in docker
    OpenCV 连通分量标记和分析
  • 原文地址:https://blog.csdn.net/weixin_62264287/article/details/133689405