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

来源:互联网 发布:奥飞数据 反馈意见 编辑:程序博客网 时间:2024/04/30 11:33
#include<stdio.h>double argu_matrix[300][300],x[300];//arguement matrix and x matrixint 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];}}