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
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值