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

开发 后端 算法
C#算法应用之高斯消元法实现是在工程学习中碰到的需要解决线性方程的问题,那么本文就向你介绍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#算法应用以及高斯消元法的实现有所帮助。

【编辑推荐】

  1. C#算法解决张老师的生日问题
  2. C#算法解决的一道面试题
  3. C#算法实现字符串反转浅析
  4. C#算法解决萝卜地问题
  5. C#九九乘法表的实现浅析
责任编辑:仲衡 来源: 互联网
相关推荐

2009-08-14 17:17:24

C#加框和消框

2009-08-17 13:07:27

C#马赛克算法

2009-08-17 14:08:33

C#进度条使用

2021-12-06 07:23:12

C# 过滤算法

2009-07-16 17:40:48

iBATIS高级查询iBATIS使用

2009-08-14 16:46:44

C#元数据

2009-08-11 10:26:49

C#算法C#字符串反转

2009-07-22 17:15:04

C#实现

2009-08-13 18:12:11

C#数据加密

2009-08-31 16:29:21

C#控制输入法

2009-08-07 17:57:26

C#定义事件应用

2009-08-11 13:54:54

约瑟夫环算法C#算法

2009-08-11 13:29:57

C#二叉树遍历

2009-09-09 18:41:42

C# 加密散列算法

2009-07-31 18:18:33

Camel命名法C#命名规范

2009-08-31 15:55:17

C#实现Strateg

2009-08-19 17:00:07

C#实现PrintPa

2009-08-25 17:55:52

C#实现Strateg

2009-08-20 14:22:17

C#实现 Contro

2009-08-14 16:25:36

C#中间语言和元数据
点赞
收藏

51CTO技术栈公众号