高斯消元求线性方程
贴图吧
秦神的课件
做的太好了
生动形象的讲述了高斯消元的做法和过程
今天刚学跟着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;
}