鱼C论坛

 找回密码
 立即注册
查看: 2179|回复: 3

c语言实现高斯消元debug

[复制链接]
发表于 2020-12-31 11:43:35 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
各位大佬,我i写的高斯消元求方程组的程序计算三阶方阵时就没有算不对,计算二阶时能得出正确结果,请问除了什么问题?谢谢大家!
代码如下:
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<math.h>
  4. #pragma warning(disable:4996)

  5. void swap(double **row,double *b,int r,int t)//将矩阵A和向量b的第r行和第t行交换
  6. {   double *m,n;
  7.         m=row[r];row[r]=row[t];row[t]=m;
  8.         n=b[r];b[r]=b[t];b[t]=n;
  9.         return;
  10. }

  11. void gauss(double **row,int n,double *b)//高斯消元
  12. {   int i,j,flag,k;
  13.         for(j=0;j<n;j++)
  14.         {   flag=0;
  15.                 for(i=j;i<n;i++)
  16.                 {   if(row[i][j]>0) flag=1;
  17.                         if(flag==1&&row[j][j]==0&&i!=j) swap(row,b,j,i);//如果第j行第j列为0,通过交换使其不为0
  18.                         if(flag==1&&row[i][j]!=0&&i!=j)
  19.                         {   for(k=j+1;k<n;k++)//消去i,j元素
  20.                                 {   row[i][k]=row[i][k]-row[i][j]/row[j][j]*row[j][k];
  21.                                         b[i]=b[i]-row[i][j]/row[j][j]*b[j];
  22.                                 }
  23.                                 row[i][j]=0;
  24.                         }
  25.                 }
  26.         }
  27. }

  28. int main()
  29. {   double **row,*b,*x;
  30.         int i,j,n;
  31.         printf("请输入矩阵阶数:");
  32.         scanf("%d",&n);
  33.         row=(double**)malloc(sizeof(double*)*n);
  34.         for(i=0;i<n;i++)
  35.                 row[i]=(double*)malloc(sizeof(double)*n);
  36.         b=(double*)malloc(sizeof(double)*n);
  37.         x=(double*)malloc(sizeof(double)*n);
  38.         printf("请输入矩阵A:\n");
  39.         for(i=0;i<n;i++)
  40.                 for(j=0;j<n;j++)
  41.                         scanf("%lf",&row[i][j]);
  42.         printf("请输入向量b:\n");
  43.         for(i=0;i<n;i++)
  44.                 scanf("%lf",&b[i]);
  45.         gauss(row,n,b);
  46.         if(fabs(row[n-1][n-1])<1e-8) printf("No Solution or Infinite solutions!\n");
  47.         else
  48.         {   for(i=n-1;i>=0;i--)
  49.                 {   for(j=n-1;j>i;j--)
  50.                                 b[i]=b[i]-row[i][j]*x[j];
  51.                         x[i]=b[i]/row[i][i];
  52.                 }
  53.                 for(i=0;i<n;i++)
  54.                         printf("x%d=%.2lf\n",i+1,x[i]);
  55.         }
  56.         free(b);free(x);
  57.         for(i=n-1;i>=0;i--)
  58.                 free(row[i]);
  59.         free(row);
  60.         return 0;
  61. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-12-31 12:57:34 | 显示全部楼层
给两个例子吧,关于向量的部分  不懂
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-31 15:50:15 | 显示全部楼层
已经解决了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-31 15:50:44 | 显示全部楼层
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<math.h>
  4. #pragma warning(disable:4996)

  5. void swap(double **row,double *b,int r,int t)//将矩阵A和向量b的第r行和第t行交换
  6. {   double *m,n;
  7.         m=row[r];row[r]=row[t];row[t]=m;
  8.         n=b[r];b[r]=b[t];b[t]=n;
  9.         return;
  10. }

  11. void gauss(double **row,int n,double *b)//高斯消元
  12. {   int i,j,flag,k;
  13.         for(j=0;j<n;j++)
  14.         {   flag=0;
  15.                 for(i=j;i<n;i++)
  16.                 {   if(row[i][j]>0) flag=1;
  17.                         if(flag==1&&row[j][j]==0&&i!=j) swap(row,b,j,i);//如果第j行第j列为0,通过交换使其不为0
  18.                         if(flag==1&&row[i][j]!=0&&i!=j)
  19.                         {   for(k=j+1;k<n;k++)//消去i,j元素
  20.                                     row[i][k]=row[i][k]-row[i][j]/row[j][j]*row[j][k];
  21.                                 b[i]=b[i]-row[i][j]/row[j][j]*b[j];
  22.                                 row[i][j]=0;
  23.                         }
  24.                 }
  25.         }
  26.         return;
  27. }

  28. int main()
  29. {   double **row,*b,*x;
  30.         int i,j,n;
  31.         printf("请输入矩阵阶数:");
  32.         scanf("%d",&n);
  33.         row=(double**)malloc(sizeof(double*)*n);
  34.         for(i=0;i<n;i++)
  35.                 row[i]=(double*)malloc(sizeof(double)*n);
  36.         b=(double*)malloc(sizeof(double)*n);
  37.         x=(double*)malloc(sizeof(double)*n);
  38.         printf("请输入矩阵A:\n");
  39.         for(i=0;i<n;i++)
  40.                 for(j=0;j<n;j++)
  41.                         scanf("%lf",&row[i][j]);
  42.         printf("请输入向量b:\n");
  43.         for(i=0;i<n;i++)
  44.                 scanf("%lf",&b[i]);
  45.         gauss(row,n,b);
  46.         if(fabs(row[n-1][n-1])<1e-8) printf("No Solution or Infinite solutions!\n");
  47.         else
  48.         {   for(i=n-1;i>=0;i--)
  49.                 {   for(j=n-1;j>i;j--)
  50.                                 b[i]=b[i]-row[i][j]*x[j];
  51.                         x[i]=b[i]/row[i][i];
  52.                 }
  53.                 for(i=0;i<n;i++)
  54.                         printf("x%d=%.3lf\n",i+1,x[i]);
  55.         }
  56.         free(b);free(x);
  57.         for(i=n-1;i>=0;i--)
  58.                 free(row[i]);
  59.         free(row);
  60.         return 0;
  61. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-5-3 16:57

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表