#include<stdio.h>
double argu_matrix[300][300],x[300];//arguement matrix and x matrix
int main(void)
{
int n,i,j,k;
double sum;
scanf("%d",&n);
for(i=0;i<n;i++)
for(j=0;j<n+1;j++)
scanf("%lf",&argu_matrix[i][j]);
//here is the lack of checking for the argu_matrix
//to do
for(i=0;i<n-1;i++)
{
for(j=i+1;j<n;j++)
argu_matrix[j][i]=argu_matrix[j][i]/argu_matrix[i][i]; //get the li parameter
for(j=i+1;j<n;j++)
for(k=i+1;k<=n;k++)
argu_matrix[j][k]=argu_matrix[j][k]-argu_matrix[j][i]*argu_matrix[i][k]; //updata the remain matrix
}
for(i=n-1;i>=0;i--) //back-substitute
{
sum=0;
for(j=i+1;j<n;j++)
sum+=argu_matrix[i][j]*x[j];
x[i]=(argu_matrix[i][n]-sum)/argu_matrix[i][i];
}
for(i=0;i<n-1;i++) //output the x[]
printf("%lf ",x[i]);
printf("%lf\n",x[i]);
return 0;
}
上面的代码精度不够,修改后如下:
#include<stdio.h>
#include<algorithm>
#define type double
#define N 100
#define Abs(x) ((x)<0?-(x):(x))
using namespace std;
type matrix[N][N];
void gauss_elimination(int n)
{
int i,j,k,r;
//消元过程
for(i=0;i<n;i++)
{
r=i;
//选绝对值最大的去消
for(j=i+1;j<n;j++) if(Abs(matrix[j][i])>Abs(matrix[r][i])) r=j;
if(r!=i) for(j=0;j<=n;j++) swap(matrix[r][j],matrix[i][j]);
//与i+1~n行进行消元
for(j=n;j>=i;j--)
for(k=i+1;k<n;k++)
matrix[k][j]-=matrix[k][i]/matrix[i][i]*matrix[i][j];
}
//回代过程
for(i=n-1;i>=0;i--)
{
for(j=i+1;j<n;j++)
matrix[i][n]-=matrix[i][j]*matrix[j][n];
matrix[i][n]/=matrix[i][i];
}
}