鱼C论坛

 找回密码
 立即注册
查看: 1191|回复: 1

[已解决]高斯消去法解线性方程组(c语言)

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

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

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

x
搞不明白,有大佬可以稍微解答一下吗,就是大致思路
最佳答案
2020-12-27 09:46:52
  1. #include <stdio.h>
  2. #define _PARAM        (5)

  3. /*
  4. 原方程:5元1次方程组
  5.         (1):        a0*X1 + b0*X2 + c0*X3 + d0*X4 + e0*X5 = f0
  6.         (2):        a1*X1 + b1*X2 + c1*X3 + d1*X4 + e1*X5 = f1
  7.         (3):        a2*X1 + b2*X2 + c2*X3 + d2*X4 + e2*X5 = f2
  8.         (4):        a3*X1 + b3*X2 + c3*X3 + d3*X4 + e3*X5 = f3
  9.         (5):        a4*X1 + b4*X2 + c4*X3 + d4*X4 + e4*X5 = f4
  10. 第一步:消除未知数 X1
  11.         (2) * a0 / a1 - (1) 得4元1次方程组
  12.         (1): (b1 * (a0/a1) - b0)*X2 + (c1 * (a0/a1) - c0)*X3 + (d1 * (a0/a1) - d0)*X4 + (e1 * (a0/a1) - e0)*X2 = f1 * (a0/a1) - f0
  13.         (2): (b2 * (a0/a2) - b0)*X2 + (c2 * (a0/a2) - c0)*X3 + (d2 * (a0/a2) - d0)*X4 + (e2 * (a0/a2) - e0)*X2 = f2 * (a0/a2) - f0
  14.         (3): (b3 * (a0/a3) - b0)*X2 + (c3 * (a0/a3) - c0)*X3 + (d3 * (a0/a3) - d0)*X4 + (e3 * (a0/a3) - e0)*X2 = f3 * (a0/a3) - f0
  15.         (4): (b4 * (a0/a4) - b0)*X2 + (c4 * (a0/a4) - c0)*X3 + (d4 * (a0/a4) - d0)*X4 + (e4 * (a0/a4) - e0)*X2 = f4 * (a0/a4) - f0
  16. 第二步: 同理消除未知数 X2
  17.         .....
  18.         最后只剩未知数 X4 = n 一元一次方程

  19. 第三步:将求得的X4,一步一步回代,分别求出X3,X2,X1,X0
  20. */

  21. int main()
  22. {
  23.         int i,j,k;
  24.         int n = _PARAM;
  25.         double temp = 0;
  26.         double param[_PARAM][_PARAM+1] =
  27.         {
  28.                 {101,97,86,74,55,145},
  29.                 {86,79,123,119,87,117},
  30.                 {96,129,136,97,64,92},
  31.                 {158,201,158,124,131,224},
  32.                 {76,102,95,53,111,135}
  33.         };

  34.         double parameter[_PARAM][_PARAM+1];
  35.         double Result_x[_PARAM] ={0};
  36.        
  37.         for(i=0 ; i<n ; i++)
  38.         {
  39.                 for(j=0; j<=n ; j++)
  40.                 {
  41.                         parameter[i][j] = param[i][j];
  42.                 }
  43.         }

  44.         //消元
  45.         for(i=0; i<n; i++)
  46.         {
  47.                 for(j=i ; j<n ; j++)
  48.                 {
  49.                         for(k=i+1; k<=n; k++)
  50.                         {
  51.                                 parameter[j][k] /= parameter[j][i];
  52.                                
  53.                                 if(j > i)
  54.                                 {
  55.                                         parameter[j][k] -= parameter[i][k];
  56.                                 }
  57.                         }
  58.                 }
  59.         }
  60.        
  61.         //回代
  62.         for(i=n-1; i>=0 ; i--)
  63.         {
  64.                 temp = 0.0;
  65.                
  66.                 for(j=n-1 ; j>i; j--)
  67.                 {
  68.                         temp += Result_x[j] * parameter[i][j];
  69.                 }
  70.                
  71.                 Result_x[i] = parameter[i][n] - temp;
  72.         }
  73.        
  74.         //输出结果及验算
  75.         for(i=0 ; i<n ; i++)
  76.         {
  77.                 printf("X%d=%f,",i,Result_x[i]);
  78.                 temp = 0;
  79.                 for(j=0 ; j<n ; j++)
  80.                 {
  81.                         temp = temp + param[i][j] * Result_x[j];
  82.                 }
  83.                 //temp = 0 证明解正确
  84.                 temp -= param[i][j];
  85.                 printf("temp=%f\n",temp);
  86.         }

  87.         return 0;
  88. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-12-27 09:46:52 | 显示全部楼层    本楼为最佳答案   
  1. #include <stdio.h>
  2. #define _PARAM        (5)

  3. /*
  4. 原方程:5元1次方程组
  5.         (1):        a0*X1 + b0*X2 + c0*X3 + d0*X4 + e0*X5 = f0
  6.         (2):        a1*X1 + b1*X2 + c1*X3 + d1*X4 + e1*X5 = f1
  7.         (3):        a2*X1 + b2*X2 + c2*X3 + d2*X4 + e2*X5 = f2
  8.         (4):        a3*X1 + b3*X2 + c3*X3 + d3*X4 + e3*X5 = f3
  9.         (5):        a4*X1 + b4*X2 + c4*X3 + d4*X4 + e4*X5 = f4
  10. 第一步:消除未知数 X1
  11.         (2) * a0 / a1 - (1) 得4元1次方程组
  12.         (1): (b1 * (a0/a1) - b0)*X2 + (c1 * (a0/a1) - c0)*X3 + (d1 * (a0/a1) - d0)*X4 + (e1 * (a0/a1) - e0)*X2 = f1 * (a0/a1) - f0
  13.         (2): (b2 * (a0/a2) - b0)*X2 + (c2 * (a0/a2) - c0)*X3 + (d2 * (a0/a2) - d0)*X4 + (e2 * (a0/a2) - e0)*X2 = f2 * (a0/a2) - f0
  14.         (3): (b3 * (a0/a3) - b0)*X2 + (c3 * (a0/a3) - c0)*X3 + (d3 * (a0/a3) - d0)*X4 + (e3 * (a0/a3) - e0)*X2 = f3 * (a0/a3) - f0
  15.         (4): (b4 * (a0/a4) - b0)*X2 + (c4 * (a0/a4) - c0)*X3 + (d4 * (a0/a4) - d0)*X4 + (e4 * (a0/a4) - e0)*X2 = f4 * (a0/a4) - f0
  16. 第二步: 同理消除未知数 X2
  17.         .....
  18.         最后只剩未知数 X4 = n 一元一次方程

  19. 第三步:将求得的X4,一步一步回代,分别求出X3,X2,X1,X0
  20. */

  21. int main()
  22. {
  23.         int i,j,k;
  24.         int n = _PARAM;
  25.         double temp = 0;
  26.         double param[_PARAM][_PARAM+1] =
  27.         {
  28.                 {101,97,86,74,55,145},
  29.                 {86,79,123,119,87,117},
  30.                 {96,129,136,97,64,92},
  31.                 {158,201,158,124,131,224},
  32.                 {76,102,95,53,111,135}
  33.         };

  34.         double parameter[_PARAM][_PARAM+1];
  35.         double Result_x[_PARAM] ={0};
  36.        
  37.         for(i=0 ; i<n ; i++)
  38.         {
  39.                 for(j=0; j<=n ; j++)
  40.                 {
  41.                         parameter[i][j] = param[i][j];
  42.                 }
  43.         }

  44.         //消元
  45.         for(i=0; i<n; i++)
  46.         {
  47.                 for(j=i ; j<n ; j++)
  48.                 {
  49.                         for(k=i+1; k<=n; k++)
  50.                         {
  51.                                 parameter[j][k] /= parameter[j][i];
  52.                                
  53.                                 if(j > i)
  54.                                 {
  55.                                         parameter[j][k] -= parameter[i][k];
  56.                                 }
  57.                         }
  58.                 }
  59.         }
  60.        
  61.         //回代
  62.         for(i=n-1; i>=0 ; i--)
  63.         {
  64.                 temp = 0.0;
  65.                
  66.                 for(j=n-1 ; j>i; j--)
  67.                 {
  68.                         temp += Result_x[j] * parameter[i][j];
  69.                 }
  70.                
  71.                 Result_x[i] = parameter[i][n] - temp;
  72.         }
  73.        
  74.         //输出结果及验算
  75.         for(i=0 ; i<n ; i++)
  76.         {
  77.                 printf("X%d=%f,",i,Result_x[i]);
  78.                 temp = 0;
  79.                 for(j=0 ; j<n ; j++)
  80.                 {
  81.                         temp = temp + param[i][j] * Result_x[j];
  82.                 }
  83.                 //temp = 0 证明解正确
  84.                 temp -= param[i][j];
  85.                 printf("temp=%f\n",temp);
  86.         }

  87.         return 0;
  88. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-4 06:04

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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