自己写的高斯消元,也不知道对不对

#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];
	}
}


 

你可能感兴趣的:(自己写的高斯消元,也不知道对不对)