C#算法应用之高斯消元法实现 - Go语言中文社区

C#算法应用之高斯消元法实现


C#算法应用之高斯消元法实现是如何的呢?我们在工程学习中经常会碰到线性方程组的求解,那么以下就是C#算法应用之高斯消元法实现代码:

  1. // 程 序 名:GaussP1.cs  
  2. // 主要功能:利用高斯消元法求线性方程组的解  
  3. // 注意:  
  4. //     本程序详细地给出了中间过程,以便在调试时分析解题过程,适合于教学。  
  5. // 适合于实际计算的另一个程序名为:GuassP1.pas  
  6.  
  7. using System;                                         // 引入System命名空间  
  8.  
  9. namespace GaussP1  
  10. {  
  11.   public class Program  
  12.   {  
  13.     public static void Main(string[] args)            // 主函数  
  14.     {                                                 // 主函数开始  
  15.       // 为了简化程序,本例只考虑方程组有***解的情况,不对其它情况进行判断。  
  16.       // n是线性方程组的个数,数组a是增广矩阵,为了方便调试,在这里直接给n和  
  17.       // 数组a赋值,在实际使用过程中要通过键盘读入它们的值  
  18.       int n = 3;   
  19.       double[,] a = {{2, -1, 3, 1}, {4, 2, 5, 4}, {1, 2, 0, 7}};  
  20.       double[] x = new double[n];  
  21.  
  22.       Gauss(n, a, x);  
  23.  
  24.       // 输出方程组的解  
  25.       Console.WriteLine("方程组的解为:");  
  26.       for(int i = 0; i < n; i++) Console.Write("x({0})={1,8:F3} ", i, x[i]);  
  27.       Console.WriteLine();  
  28.     }  
  29.  
  30.     // 利用高斯消元法求线性方程组的解  
  31.     public static void Gauss(int n, double[,] a, double[] x)  
  32.     {  
  33.       double d;  
  34.  
  35.       Console.WriteLine("高斯消去法解方程组的中间过程");  
  36.       Console.WriteLine("============================");  
  37.       Console.WriteLine("中间过程");  
  38.       Console.WriteLine("增广矩阵:");  
  39.       printArray(n, a); Console.WriteLine();  
  40.         
  41.       // 消元  
  42.       for(int k = 0; k < n; k++)  
  43.       {  
  44.         Console.WriteLine("第{0}步", k + 1);  
  45.         Console.WriteLine("初始矩阵:");  
  46.         printArray(n, a); Console.WriteLine();  
  47.  
  48.         selectMainElement(n, k, a); // 选择主元素  
  49.         Console.WriteLine("选择主元素后的矩阵:");  
  50.         printArray(n, a); Console.WriteLine();  
  51.  
  52.         // for (int j = k; j <= n; j++ ) a[k, j] = a[k, j] / a[k, k];  
  53.         // 若将下面两个语句改为本语句,则程序会出错,因为经过第1次循环  
  54.         // 后a[k,k]=1,a[k,k]的值发生了变化,所以在下面的语句中先用d  
  55.         // 将a[k,k]的值保存下来  
  56.         d = a[k, k];  
  57.         for (int j = k; j <= n; j++ ) a[k, j] = a[k, j] / d;  
  58.         Console.WriteLine("将第{0}行中a[{0},{0}]化为1后的矩阵:", k + 1);  
  59.         printArray(n, a); Console.WriteLine();  
  60.  
  61.         // Guass消去法与Jordan消去法的主要区别就是在这一步,Gauss消去法是从k+1  
  62.         // 到n循环,而Jordan消去法是从1到n循环,中间跳过第k行  
  63.         for(int i = k + 1; i < n; i++)  
  64.         {  
  65.            d = a[i, k];  // 这里使用变量d将a[i,k]的值保存下来的原理与上面注释中说明的一样  
  66.            for (int j = k; j <= n; j++) a[i, j] = a[i, j] - d * a[k, j];  
  67.         }  
  68.  
  69.         Console.WriteLine("消元后的矩阵:");  
  70.         printArray(n, a); Console.WriteLine();  
  71.       }  
  72.  
  73.       // 回代  
  74.       x[n - 1] = a[n - 1, n];  
  75.       for (int i = n - 1; i >= 0; i--)  
  76.       {  
  77.         x[i] = a[i, n];  
  78.         for (int j = i + 1; j < n; j++) x[i] = x[i] - a[i, j] * x[j];  
  79.       }  
  80.     }  
  81.  
  82.     // 选择主元素  
  83.     public static void selectMainElement(int n, int k, double[,] a)  
  84.     {  
  85.       // 寻找第k列的主元素以及它所在的行号  
  86.       double t, mainElement;            // mainElement用于保存主元素的值  
  87.       int l;                            // 用于保存主元素所在的行号  
  88.  
  89.       // 从第k行到第n行寻找第k列的主元素,记下主元素mainElement和所在的行号l  
  90.       mainElement = Math.Abs(a[k, k]);  // 注意别忘了取绝对值  
  91.       l = k;  
  92.       for(int i = k + 1; i < n; i++)  
  93.       {  
  94.         if (mainElement < Math.Abs(a[i, k]))  
  95.         {  
  96.           mainElement = Math.Abs(a[i, k]);  
  97.           l = i;                        // 记下主元素所在的行号  
  98.         }  
  99.       }  
  100.  
  101.       // l是主元素所在的行。将l行与k行交换,每行前面的k个元素都是0,不必交换  
  102.       if (l != k)  
  103.       {  
  104.         for (int j = k; j <= n; j++)  
  105.         {   
  106.           t = a[k, j]; a[k, j] = a[l, j]; a[l, j] = t;  
  107.         }  
  108.       }  
  109.     }  
  110.  
  111.     // 打印矩阵  
  112.     public static void printArray(int n, double[,] a)  
  113.     {  
  114.       for(int i = 0; i < n; i++)  
  115.       {  
  116.         for (int j = 0; j <= n; j++ ) Console.Write("{0,10:F6} ", a[i, j]);  
  117.         Console.WriteLine();  
  118.       }  
  119.     }  
  120.   }  

C#算法应用之高斯消元法实现程序的运行结果:

高斯消去法解方程组的中间过程
中间过程

增广矩阵:

2.000000 -1.000000  3.000000  1.000000

4.000000  2.000000  5.000000  4.000000

1.000000  2.000000  0.000000  7.000000

第1步

初始矩阵:

2.000000 -1.000000  3.000000  1.000000

4.000000  2.000000  5.000000  4.000000

1.000000  2.000000  0.000000  7.000000

选择主元素后的矩阵:
4.000000  2.000000  5.000000  4.000000

2.000000 -1.000000  3.000000  1.000000

1.000000  2.000000  0.000000  7.000000

将第1行中a[1,1]化为1后的矩阵

1.000000  0.500000  1.250000  1.000000

2.000000 -1.000000  3.000000  1.000000

1.000000  2.000000  0.000000  7.000000

消元后的矩阵

1.000000  0.500000  1.250000  1.000000

0.000000 -2.000000  0.500000 -1.000000

0.000000  1.500000 -1.250000  6.000000

第2步

初始矩阵:

1.000000  0.500000  1.250000  1.000000

0.000000 -2.000000  0.500000 -1.000000

0.000000  1.500000 -1.250000  6.000000

选择主元素后的矩阵:

1.000000  0.500000  1.250000  1.000000

0.000000 -2.000000  0.500000 -1.000000

0.000000  1.500000 -1.250000  6.000000

将第2行中a[2,2]化为1后的矩阵

1.000000  0.500000  1.250000  1.000000

0.000000  1.000000 -0.250000  0.500000

0.000000  1.500000 -1.250000  6.000000

消元后的矩阵

1.000000  0.500000  1.250000  1.000000

0.000000  1.000000 -0.250000  0.500000

0.000000  0.000000 -0.875000  5.250000

第3步

初始矩阵:

1.000000  0.500000  1.250000  1.000000

0.000000  1.000000 -0.250000  0.500000

0.000000  0.000000 -0.875000  5.250000

选择主元素后的矩阵:

1.000000  0.500000  1.250000  1.000000

0.000000  1.000000 -0.250000  0.500000

0.000000  0.000000 -0.875000  5.250000

将第3行中a[3,3]化为1后的矩阵

1.000000  0.500000  1.250000  1.000000

0.000000  1.000000 -0.250000  0.500000

0.000000  0.000000  1.000000 -6.000000

消元后的矩阵

1.000000  0.500000  1.250000  1.000000

0.000000  1.000000 -0.250000  0.500000

0.000000  0.000000  1.000000 -6.000000

方程组的解为:

x(1)=9.000  x(2)=-1.000  x(3)=-6.000

C#算法应用之高斯消元法实现就向你介绍到这里,希望对你了解C#算法应用以及高斯消元法的实现有所帮助。

版权声明:本文来源51CTO,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:http://developer.51cto.com/art/200908/143283.htm
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2021-05-16 19:41:21
  • 阅读 ( 1142 )
  • 分类:算法

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢