• 数学知识——高斯消元(初等行变换解方程组)代码实现


    高斯消元的作用

    求解n个未知数、n个方程的方程组

     例如如下n个方程、n个未知数:

     写成n*(n+1)的矩阵:

    枚举每一列

    第一步:找到绝对值最大的一行

    第二步:将该行换到最上面

    第三步:将该行的第一个数变成1

    第四步:将下面行的此列变为0

    注意的是,换好了的行不需要动!

     举一个例子:

    求解有三个方程、三个未知数的方程组:

    写成矩阵形式:

     枚举第一列,找到最大行:

     将该行换到最上面,并将该行第一个数变为1:

     将下面行的第1列都变成0:

     枚举第二列,找到绝对值最大的一行,将该行的第一个数变成1:

     将下面行的第1列都变成0:

     遍历第三列(由于第一行和第二行都已经改变好了,不需要动了),这里直接把第三行的第一个数变为1就行了:

     最后化简为:

    由此可以依次算出:

    x3=3;

    x2=-2;

    x1=3;

    例题链接: 883. 高斯消元解线性方程组 - AcWing题库

     

    代码(详细注释):

    1. #include<bits/stdc++.h>
    2. using namespace std;
    3. #define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
    4. typedef long long ll;
    5. const int N=110;
    6. const double eps=1e-8;
    7. int n;
    8. double a[N][N];
    9. int gauss()// 高斯消元,答案存于a[i][n]中,0 <= i < n
    10. {
    11. int c,r;//c代表列,r代表行
    12. for(c=0,r=0;c<n;c++)//枚举每一列
    13. {
    14. int t=r;//存绝对值最大的行
    15. for(int i=r;i<n;i++)//找到绝对值最大的行
    16. if(fabs(a[i][c])>fabs(a[t][c])) t=i;
    17. if(fabs(a[t][c])<eps)//最大值为0
    18. continue;
    19. for(int i=c;i<=n;i++) swap(a[t][i],a[r][i]);// 将绝对值最大的行换到最顶端
    20. for(int i=n;i>=c;i--) a[r][i]/=a[r][c];//将当前行的首位变成1
    21. for(int i=r+1;i<n;i++)// 用当前行将下面所有的列消成0
    22. if(fabs(a[i][c])>eps)
    23. for(int j=n;j>=c;j--)
    24. a[i][j]=a[i][j]-a[r][j]*a[i][c];
    25. r++;
    26. }
    27. if(r<n)
    28. {
    29. for(int i=r;i<n;i++)
    30. if(fabs(a[i][n])>eps) return 2;//无解
    31. return 1;//多解
    32. }
    33. for(int i=n-1;i>=0;i--)
    34. for(int j=i+1;j<n;j++)
    35. a[i][n]=a[i][n]-a[i][j]*a[j][n];
    36. return 0;
    37. }
    38. int main()
    39. {
    40. IOS;
    41. cin>>n;
    42. for(int i=0;i<n;i++)
    43. for(int j=0;j<=n;j++)
    44. cin>>a[i][j];
    45. int t=gauss();
    46. if(t==2) cout<<"No solution"<<endl;//无解
    47. else if(t==1) cout<<"Infinite group solutions"<<endl;//多解
    48. else//唯一解
    49. {
    50. for(int i=0;i<n;i++)
    51. {
    52. if(fabs(a[i][n])<eps) a[i][n]=0;//去掉输出-0.00的情况
    53. printf("%.2lf\n", a[i][n]);
    54. }
    55. }
    56. return 0;
    57. }

  • 相关阅读:
    U-Net在2022年相关研究的论文推荐
    Java多线程-线程生命周期(一)
    一个 不用充钱 也能让你变强的 VSCode 插件
    Makefile(二)
    Pjax 下动态加载插件方案
    【iOS】—— 通知、单例、代理以及设计模式总结
    使用HTML+CSS实现一个静态页面——面包蛋糕 (9页)
    2024年智能手表行业线上市场销售数据分析
    隆云通五要素微气象仪
    【附源码】计算机毕业设计JAVA校园绿化管理系统
  • 原文地址:https://blog.csdn.net/WSY444/article/details/125624374