猪冰龙

导航

C# 顺序高斯(Gauss)消去法计算一元多次方程组

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Threading.Tasks;
 6 
 7 namespace zblGauss1
 8 {
 9     class Program
10     {
11         static void Main(string[] args)
12         {
13             double[,] a = { { 8.1, 2.3, -1.5, 6.1 }, { 0.5, -6.23, 0.87, 2.3 }, { 2.5, 1.5, 10.2, 1.8 } };
14             //double[,] a = { { 2, -1, 3, 1 }, { 4, 2, 5, 4 }, { 1, 2, 0, 7 } };
15             int n = a.GetLength(0);//数组a的第一维长度,即行数,3
16             double[] x = new double[n];//存放解的数组,初始值为0
17 
18             Gauss1(n, a, x);//调用Gauss1 方法计算用顺序高斯消去法计算一元多次方程组
19             Console.WriteLine("方程的根为:");//输出方程组的根
20             for (int i = 0; i < n; i++)
21             {
22                 Console.Write("x{0}={1,10:F10}, ", i, x[i]);
23             }
24         }
25 
26         //利用顺序高斯Gauss消元法求一元多次线性方程组的解
27         public static void Gauss1(int n, double[,] a, double[] x)//写了一个静态方法,方法可以在别的方法中直接调用,不必声明对象然后调用对象中的方法了
28         {
29             Console.WriteLine("-----------利用顺序高斯Gauss消元法求线性方程组的解----------");
30             Console.WriteLine("要计算的增广矩阵a为:");
31             printArray(n, a);
32 
33             //消元过程
34             for (int k = 0; k < n - 1; k++)//k=0 1 ,弄出来两个主元即可 ,两次大循环,此称为1层循环  ---主元---
35             {
36                 for (int i = k; i < n - 1; i++)//每个大循环中   要对主元素下面所有元素变化为零,,  ---行---  ,i= 0 1 ,此称为2层循环
37                 {
38                     double m = a[i + 1, k] / a[k, k];//可能用到多次,在此将化零因子放入m中
39                     for (int j = k; j <= n; j++) //2层循环中要对每行所有元素都做相同变化,   ---列---    ,  j=
40                     {
41                         a[i + 1, j] = a[i + 1, j] - m * a[k, j];//由于第一行第一列元素不用化零,故首先从i+1开始,同列所以后面都是j,k处为主元行处
42                     }
43                     Console.WriteLine("第{0}个主元第{1}次变换后增广矩阵为:", k, i);
44                     printArray(n, a);
45                 }
46                 Console.WriteLine();
47             }
48 
49             //回代过程
50             for (int k = n - 1; k >= 0; k--) //k=2 1 0 从最后一行开始往前迭代
51             {
52                 double addResult = 0.0;//用于存放已知的未知数代入相应式子中之和,换一行计算时需要清零,故放在此处
53                 for (int j = k; j < n - 1; j++)//j=2   j 最大值为2,每行未知数可能不止一个,故需要遍历已知的未知数并代入
54                 {
55                     addResult = addResult + x[j + 1] * a[k, j + 1];//k代表计算的行,j+1代表的列,系数与解要对应,故都为 j+1
56                 }
57                 x[k] = (a[k, n] - addResult) / a[k, k];//本行的未知数用本行最右边数-本行已知未知数代入系数之差 再除以本未知数系数
58             }
59 
60         }
61         public static void printArray(int n, double[,] a)
62         {
63             for (int i = 0; i < n; i++)
64             {
65                 for (int j = 0; j <= n; j++)
66                 {
67                     Console.Write("{0,10:F6}", a[i, j]);
68                 }
69                 Console.WriteLine();
70             }
71 
72 
73         }
74     }
75 }

 

高斯消去法由消元和回代两个过程组成。消元就是对增广矩阵做有限次的初等行变换,使它的系数矩阵部分变为一个上三角矩阵。所用的初等行变换主要有两种:第一种,交换两行的位置;第二种,用一个数乘某一行加到另一行上。

经过n-1次消元后,原增广矩阵变为行阶梯矩阵。

 

高斯消去法分为顺序高斯消去法和列主元素消去法两种。

顺序高斯消去法:在消元过程中对增广矩阵只做前述的第二种初等行变换就形成了顺序Gauss消去法。

 

原创, 转载请注明出处,谢谢。

posted on 2016-09-22 17:36  猪冰龙  阅读(3911)  评论(0编辑  收藏  举报