高斯消元法解线性方程组
高斯消元的目的是将矩阵变为上三角矩阵
选定未被选择过的、xi项系数绝对值最大的一行(这样更加容易判断是否有解),将整个式子除以xi的系数(xi系数化为1)。同时将其交换至第i行(方便求解)
将未被选择过的行中的该项全部按照系数相应的减去选定的那行的系数(剩下的其他行xi系数化为0)
当所有行都选定过时,已经构成了上三角
倒序求解,每次将常数减去已经求出的所有项的解,此时可以求出当前项的解(将已知解带入求未知解)最后依次输出即可
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
|
int n;cin>>n; vector<vector<double>>g(n+1,vector<double>(n+2)); for(int i=1;i<=n;i++){ for(int j=1;j<=n+1;j++){ cin>>g[i][j]; } } auto Gauss=[&](){ for(int i=1;i<=n;i++){ int now=i; for(int j=i+1;j<=n;j++){ if(fabs(g[now][i])<fabs(g[j][i])){ now=j; } } for(int j=i;j<=n+1;j++){ swap(g[now][j],g[i][j]); } if(abs(g[i][i]-0.0)<1e-4){ cout<<"No Solution"<<"\n"; exit(0); } for(int j=i+1;j<=n+1;++j){ g[i][j]/=g[i][i]; } g[i][i]=1; for(int j=i+1;j<=n;j++){ for(int k=i+1;k<=n+1;k++){ g[j][k]-=g[j][i]*g[i][k]; } g[j][i]=0; } } }; Gauss(); for(int i=n;i>=1;--i){ for(int j=i+1;j<=n;++j){ g[i][n+1]-=g[i][j]*g[j][n+1]; g[i][j]=0; } g[i][n+1]/=g[i][i]; g[i][i]=1; } for(int i=1;i<=n;i++){ cout<<fixed<<setprecision(2)<<g[i][n+1]<<"\n"; }
|
Welcome to my other publishing channels
v1.5.2