- // 程 序 名:GaussP1.cs
- // 主要功能:利用高斯消元法求线性方程组的解
- // 注意:
- // 本程序详细地给出了中间过程,以便在调试时分析解题过程,适合于教学。
- // 适合于实际计算的另一个程序名为:GuassP1.pas
- using System; // 引入System命名空间
- namespace GaussP1
- {
- public class Program
- {
- public static void Main(string[] args) // 主函数
- { // 主函数开始
- // 为了简化程序,本例只考虑方程组有***解的情况,不对其它情况进行判断。
- // n是线性方程组的个数,数组a是增广矩阵,为了方便调试,在这里直接给n和
- // 数组a赋值,在实际使用过程中要通过键盘读入它们的值
- int n = 3;
- double[,] a = {{2, -1, 3, 1}, {4, 2, 5, 4}, {1, 2, 0, 7}};
- double[] x = new double[n];
- Gauss(n, a, x);
- // 输出方程组的解
- Console.WriteLine("方程组的解为:");
- for(int i = 0; i < n; i++) Console.Write("x({0})={1,8:F3} ", i, x[i]);
- Console.WriteLine();
- }
- // 利用高斯消元法求线性方程组的解
- public static void Gauss(int n, double[,] a, double[] x)
- {
- double d;
- Console.WriteLine("高斯消去法解方程组的中间过程");
- Console.WriteLine("============================");
- Console.WriteLine("中间过程");
- Console.WriteLine("增广矩阵:");
- printArray(n, a); Console.WriteLine();
- // 消元
- for(int k = 0; k < n; k++)
- {
- Console.WriteLine("第{0}步", k + 1);
- Console.WriteLine("初始矩阵:");
- printArray(n, a); Console.WriteLine();
- selectMainElement(n, k, a); // 选择主元素
- Console.WriteLine("选择主元素后的矩阵:");
- printArray(n, a); Console.WriteLine();
- // for (int j = k; j <= n; j++ ) a[k, j] = a[k, j] / a[k, k];
- // 若将下面两个语句改为本语句,则程序会出错,因为经过第1次循环
- // 后a[k,k]=1,a[k,k]的值发生了变化,所以在下面的语句中先用d
- // 将a[k,k]的值保存下来
- d = a[k, k];
- for (int j = k; j <= n; j++ ) a[k, j] = a[k, j] / d;
- Console.WriteLine("将第{0}行中a[{0},{0}]化为1后的矩阵:", k + 1);
- printArray(n, a); Console.WriteLine();
- // Guass消去法与Jordan消去法的主要区别就是在这一步,Gauss消去法是从k+1
- // 到n循环,而Jordan消去法是从1到n循环,中间跳过第k行
- for(int i = k + 1; i < n; i++)
- {
- d = a[i, k]; // 这里使用变量d将a[i,k]的值保存下来的原理与上面注释中说明的一样
- for (int j = k; j <= n; j++) a[i, j] = a[i, j] - d * a[k, j];
- }
- Console.WriteLine("消元后的矩阵:");
- printArray(n, a); Console.WriteLine();
- }
- // 回代
- x[n - 1] = a[n - 1, n];
- for (int i = n - 1; i >= 0; i--)
- {
- x[i] = a[i, n];
- for (int j = i + 1; j < n; j++) x[i] = x[i] - a[i, j] * x[j];
- }
- }
- // 选择主元素
- public static void selectMainElement(int n, int k, double[,] a)
- {
- // 寻找第k列的主元素以及它所在的行号
- double t, mainElement; // mainElement用于保存主元素的值
- int l; // 用于保存主元素所在的行号
- // 从第k行到第n行寻找第k列的主元素,记下主元素mainElement和所在的行号l
- mainElement = Math.Abs(a[k, k]); // 注意别忘了取绝对值
- l = k;
- for(int i = k + 1; i < n; i++)
- {
- if (mainElement < Math.Abs(a[i, k]))
- {
- mainElement = Math.Abs(a[i, k]);
- l = i; // 记下主元素所在的行号
- }
- }
- // l是主元素所在的行。将l行与k行交换,每行前面的k个元素都是0,不必交换
- if (l != k)
- {
- for (int j = k; j <= n; j++)
- {
- t = a[k, j]; a[k, j] = a[l, j]; a[l, j] = t;
- }
- }
- }
- // 打印矩阵
- public static void printArray(int n, double[,] a)
- {
- for(int i = 0; i < n; i++)
- {
- for (int j = 0; j <= n; j++ ) Console.Write("{0,10:F6} ", a[i, j]);
- Console.WriteLine();
- }
- }
- }
- }
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#算法应用以及高斯消元法的实现有所帮助。
【编辑推荐】