高斯消元part2
今天整一整高斯消元的模板,正经的
高斯消元主要用于解n元一次线性方程组与判断是否有解
主要思想? 就是高斯消元啊
主要思想是理想状态下消为每行除最后一项外只有一个1,并且每行位置互异,具体看下面。
这里代码的目的主要是求方程的解
代码:
#include<bits/stdc++.h> using namespace std; int n; double a[105][105]; int main(){ scanf("%d",&n); for(int i=1;i<=n;i++){ for(int j=1;j<=n+1;j++) scanf("%lf",&a[i][j]); } for(int i=1;i<=n;i++){ int t=i; while(a[t][i]==0&&t<=n) t++; //判断是否有解,如果每行对于某项系数全为0,则视为无解(无唯一解) if(t==n+1){ cout<<"No Solution"; return 0; } for(int j=1;j<=n+1;j++) swap(a[t][j],a[i][j]); //(通行列式)如果首项为0,则挑一行不为零的换下 double x=a[i][i]; //保存系数,以便下面用 for(int j=1;j<=n+1;j++) a[i][j]/=x; for(int j=1;j<=n;j++){ if(j==i) continue; //这里主要思想放在下面注释point x=a[j][i]; for(int k=1;k<=n+1;k++){ a[j][k]-=x*a[i][k]; } } } for(int i=1;i<=n;i++) printf("%0.2lf\n",a[i][n+1]); //因系数消为1,顾每行最后即为解 return 0; }
point:
对于计算每行“i”,i即表示行数,即对于每行进行消元,理想状态下需把第n行的第n项系数消为1,其余消掉(消为0),所以当j==i时,跳过不做消元处理,只在之前那一步把系数化为1,其他位置的系数留给下面的式子来消,故当j!=i时,用这一行把其他同位置的系数消为0,并且如果有解,则数据保证能消为理想状态(好像证明的一部分已经给出了。。。)