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消去法。

 

原創, 轉載請注明出處,謝謝。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM