高斯消元法

高斯消元法。直接附代码了,这个代码没有回带的。

 1 //Writer : Hsz %WJMZBMR%tourist%hzwer
 2 #include<iostream>
 3 #include<cstring>
 4 #include<cstdio>
 5 #include<cmath>
 6 #include<queue>
 7 #include<map>
 8 #include<set>
 9 #include<stack>
10 #include<vector>
11 #include<cstdlib>
12 #include<algorithm>
13 #define LL long long
14 using namespace std;
15 int n,w[105];
16 const double eps=1e-8;
17 double a[105][105],b[105],v[105];
18 void gauss() {
19     for(int i=1; i<=n; i++) {//枚举每个方程,并记录每个该方程最大的系数
20         int p=0;
21         double mx=0;
22         for(int j=1; j<=n; j++) 
23             if(fabs(a[i][j])-eps>mx) mx=fabs(a[i][j]),p=j;
24         if(!p) {
25             printf("No Solution");
26             return;
27         }
28         w[i]=p;
29         for(int j=1; j<=n; j++)
30             if(i!=j) {
31                 double tt=a[j][p]/a[i][p];
32                 for(int k=1; k<=n+1; k++)//记得把方程右边的结果也要消
33                     a[j][k]-=a[i][k]*tt;  //消元,消到这个方程的系数构成的矩阵每行只有一个为0,每列只有一个为0.
34             }
35     }
36     for(int i=1; i<=n; i++) v[w[i]]=a[i][n+1]/a[i][w[i]];//用v[]记录答案,w[]表示的是未消掉的那个元的位置。
37     for(int i=1; i<=n; i++) printf("%.2lf\n" ,v[i]);
38 }
39 int main() {
40     cin>>n;
41     for(int i=1; i<=n; i++)
42         for(int j=1; j<=n+1; j++)
43             scanf("%lf",&a[i][j]);
44 
45     gauss();
46     return 0;
47 }

upd:20200924 22时 

再补一个,判断多解&无解的,但是我没试过,感觉对的

消元结束后,看每个方程系数不为0的项的数目,如果自由元的数目是0,而且等式右边不为0,无解;如果自由元的数目大于一,那么该方程组就有多解。

 

for(int i=1;i<=n;i++) {
  int cnt=0;
  for(int j=1;j<=n;j++) {
    if(fabs(a[i][j])<eps) cnt++;
  }
  if(cnt==1) continue;
  if(cnt>1) {printf("more\n");return 0;}//多解
  if(cnt==0&&fabs(a[i][n+1])>eps) {printf("no solution\n");return 0;}//无解
}

 

 

不保证正确性,如果有错,欢迎指正。

 

posted @ 2018-05-06 12:06  SWHsz  阅读(186)  评论(0编辑  收藏  举报