• 杨仔ysf
    了解作者
  • C/C++
    开发工具
  • 1KB
    文件大小
  • rar
    文件格式
  • 0
    收藏次数
  • 1 积分
    下载积分
  • 0
    下载次数
  • 2018-06-18 12:29
    上传日期
利用无回代的高斯约旦法求解方程组,包含选主元过程
gauss-Jordan.rar
  • gauss-Jordan
  • gaosi-jordan.c
    2.3KB
内容介绍
#include<stdio.h> #include<stdlib.h> #include<math.h> int main() { FILE *fp; int i,j,n; double **a,*b,*x; double max=-1,t; //max用于选主元 int r,k=1; double temp; if((fp=fopen("gauss.txt","r"))==NULL) { printf("File open error!\n"); exit(0); } fscanf(fp,"%d",&n); //读入系数行列式阶数n a=(double **)malloc(n*sizeof(double *)); b=(double *)malloc(n*sizeof(double)); x=(double *)malloc(n*sizeof(double)); for(j=1;j<=n;j++){ a[j]=(double *)malloc(n*sizeof(double)); } printf("n=%d\n",n); for(i=1;i<=n;i++){ for(j=1;j<=n;j++) fscanf(fp,"%lf",&a[i][j]); fscanf(fp,"%lf",&b[i]); } if(fclose(fp)) { printf("Can not close the file!\n"); exit(0); } printf("输入的矩阵为:\n"); for(i=1;i<=n;i++){ for(j=1;j<=n;j++) printf("a[%d][%d]=%.f ",i,j,a[i][j]); printf("b[%d]=%.f\n",i,b[i]); } //1.1选主元 k:对角线行/列 产生主元a[r][k] do //k=1,2 { for(i=k;i<=n;i++) //找出第k列绝对值最大数max=a[r][k](在r行) if(fabs(a[i][k])>max){ max=a[i][k]; r=i; //r记录最大值所在-行 } if(a[r][k]==0) //奇异矩阵,无法计算 { printf("Cannot solve!\n"); exit(0); } //1.2换行 主元a[r][k]->a[k][k] for(j=1;j<=n;j++) //交换第k行和r行,交换后主元在第k行。 { { t=a[r][j]; a[r][j]=a[k][j]; a[k][j]=t; } { t=b[r]; b[r]=b[k]; b[k]=t; } } //2.消去同列中其它项 for(i=1;i<=n;i++){ if(i!=k){ temp=a[i][k]/a[k][k]; //temp=-1/5 for(j=1;j<=n;j++){ a[i][j]-=temp*a[k][j]; //a[2][1]=0,a[2][2]= } b[i]-=temp*b[k]; } } // printf("temp=%.6f\n",temp); //测试 /* for(i=1;i<=n;i++){ for(j=1;j<=n;j++) printf("a[%d][%d]=%.6f ",i,j,a[i][j]); printf("b[%d]=%.6f\n",i,b[i]); } printf("\n"); */ k=k+1; max=-1; }while(k<=n); printf("化为对角阵为:\n"); for(i=1;i<=n;i++){ for(j=1;j<=n;j++) printf("a[%d][%d]=%.6f ",i,j,a[i][j]); printf("b[%d]=%.6f\n",i,b[i]); } //3.求解 printf("求得其解x为:\n"); for(i=1;i<=n;i++) { x[i]=b[i]/a[i][i]; } for(i=1;i<=n;i++) printf(" x%d=%.1f\n",i,x[i]); return 0; }
评论
    相关推荐