高斯消元

xiaoxiao2021-02-28  58

高斯消元求线性方程

贴图吧 秦神的课件 做的太好了 生动形象的讲述了高斯消元的做法和过程

今天刚学跟着lyh打的模板

#include<iostream> double a[N][N]; void gauss(int n){ for(int i=1;i<=n;i++){ int p=-1; for(int j=1;j<=n && p==-1;j++) if(fabs(a[i][j])>eps) p=j; if(p==-1){ if(fabs(a[i][n+1])<eps) puts("duo jie"); else puts("wu jie"); return ; } where[i]=p; for(int j=1;j<=n;j++) if(i!=j){//其他方程 double t=a[j][p]/a[i][p];//注意j和i不要写反 for(int k=1;k<=n+1;k++)//n+1 important a[j][k]-=a[i][k]*t; } } for(int i=1;i<=n;i++) x[where[i]]=a[i][n+1]/a[i][where[i]]; }

emmm这就是精髓部分? 然后做了个模板题 solution拼错wa了好几遍··· 还是粘过来吧

#include<iostream> #include<cstdio> #include<algorithm> #include<cmath> #include<cstdlib> #include<ctime> #define maxn 105 using namespace std; int n,where[maxn]; const double eps=1e-6; double a[maxn][maxn],ans[maxn]; void gauss(int n){ for(int i=1;i<=n;i++){ int p=-1; double mx=0; for(int j=1;j<=n;j++){ if(fabs(a[i][j])-eps>mx) mx=fabs(a[i][j]),p=j; } if(p==-1) {printf("No Solution\n"); exit(0);} where[i]=p; for(int j=1;j<=n;j++) if(i!=j){ double t=a[j][p]/a[i][p]; for(int k=1;k<=n+1;k++) a[j][k]-=t*a[i][k]; } } for(int i=1;i<=n;i++) ans[where[i]]=a[i][n+1]/a[i][where[i]]; } 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]); gauss(n); for(int i=1;i<=n;i++) printf("%.2lf\n",ans[i]); return 0; }
转载请注明原文地址: https://www.6miu.com/read-2626636.html

最新回复(0)