计算方法实验三 高斯消元

时间:2021-10-23 22:38:04

一般性的高斯消元



#include<math.h>
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;

#define MAXN 100
#define mem(a) memset(a,0,sizeof(a))
const double eps=1e-9;
double arr[MAXN][MAXN];
double ans[MAXN];
int equ,var;///方程的个数,变量的个数

int Gauss()
{
int row=0,col=0;
for(;row<equ&&col<var;row++,col++)
{
int max_r=row;
for(int i=row+1;i<equ;i++)
if(fabs(arr[i][col])>fabs(arr[max_r][col]))
max_r=i;

if(fabs(arr[max_r][col])<eps)
return 0;

if(row!=max_r){
for(int j=col;j<var;j++)
swap(arr[row][j],arr[max_r][j]);
swap(ans[row],ans[max_r]);
}

ans[row]/=arr[row][col];
for(int j=col+1;j<var;j++)
arr[row][j]/=arr[row][col];
arr[row][col]=1;

for(int i=0;i<equ;i++){
if(i!=row){
ans[i]-=ans[row]*arr[i][row];
for(int j=col+1;j<var;j++)
arr[i][j]-=arr[row][j]*arr[i][col];
arr[i][col]=0;
}
}
}
return 1;
}
int main()
{
int n;
int cases=1;
//freopen("in.txt","r",stdin);
while(scanf("%d",&n)!=EOF)
{
mem(arr),mem(ans);

equ=var=n;
for(int i=0;i<n;i++){
for(int j=0;j<n;j++)
scanf("%lf",&arr[i][j]);
scanf("%lf",&ans[i]);
}
Gauss();

printf("Case #%d: \n",cases++);
for(int i=0;i<n;i++)
printf("%.2lf ",ans[i]);
puts("");
}
return 0;
}