【模板】高斯消元法
题目背景
Gauss消元
题目描述
给定一个线性方程组,对其求解
输入输出格式
输入格式:第一行,一个正整数 nnn
第二至 n+1n+1n+1行,每行 n+1n+1n+1 个整数,为a1,a2⋯an a_1, a_2 \cdots a_na1,a2⋯an 和 bbb,代表一组方程。
输出格式:共n行,每行一个数,第 iii行为 xix_ixi (保留2位小数)
如果不存在唯一解,在第一行输出"No Solution".
输入输出样例
输入样例#1:
3 1 3 4 5 1 4 7 3 9 3 2 2
输出样例#1:
-0.97 5.18 -2.39
说明
1≤n≤100,∣ai∣≤104,∣b∣≤104i
主要步骤如下(构成上三角):
1.选定未被选择过的、xi项系数绝对值最大的一行(这样更加容易判断是否有解),将整个式子除以xi的系数(xi系数化为1)。同时将其交换至第i行(方便求解)
2.将未被选择过的行中的该项全部按照系数相应的减去选定的那行的系数(剩下的其他行xi系数化为0)
当所有行都选定过时,已经构成了上三角
3.倒序求解,每次将常数减去已经求出的所有项的解,此时可以求出当前项的解(将已知解带入求未知解)
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<cmath> 6 using namespace std; 7 double a[102][102]; 8 int n; 9 int main() 10 {int i,j,now,k; 11 cin>>n; 12 for (i=1;i<=n;i++) 13 for (j=1;j<=n+1;j++) 14 scanf("%lf",&a[i][j]); 15 for (i=1;i<=n;i++) 16 { 17 now=i; 18 for (j=i+1;j<=n;j++) 19 if (fabs(a[now][i])<fabs(a[j][i])) 20 now=j; 21 for (j=i;j<=n+1;j++) 22 swap(a[now][j],a[i][j]); 23 if (a[i][i]==0) 24 { 25 cout<<"No Solution"<<endl; 26 return 0; 27 } 28 for (j=i+1;j<=n+1;j++) 29 a[i][j]/=a[i][i]; 30 a[i][i]=1; 31 for (j=i+1;j<=n;j++) 32 { 33 for (k=i+1;k<=n+1;k++) 34 a[j][k]-=a[i][k]*a[j][i]; 35 a[j][i]=0; 36 } 37 } 38 for (i=n;i>=1;i--) 39 { 40 for (j=i+1;j<=n;j++) 41 { 42 a[i][n+1]-=a[i][j]*a[j][n+1]; 43 a[i][j]=0; 44 } 45 a[i][n+1]/=a[i][i]; 46 a[i][i]=1; 47 } 48 for (i=1;i<=n;i++) 49 printf("%.2lf\n",a[i][n+1]); 50 }
∣≤104,∣b∣≤104