C#算法應(yīng)用之高斯消元法實(shí)現(xiàn)
- // 程 序 名:GaussP1.cs
- // 主要功能:利用高斯消元法求線性方程組的解
- // 注意:
- // 本程序詳細(xì)地給出了中間過程,以便在調(diào)試時(shí)分析解題過程,適合于教學(xué)。
- // 適合于實(shí)際計(jì)算的另一個(gè)程序名為:GuassP1.pas
- using System; // 引入System命名空間
- namespace GaussP1
- {
- public class Program
- {
- public static void Main(string[] args) // 主函數(shù)
- { // 主函數(shù)開始
- // 為了簡化程序,本例只考慮方程組有***解的情況,不對(duì)其它情況進(jìn)行判斷。
- // n是線性方程組的個(gè)數(shù),數(shù)組a是增廣矩陣,為了方便調(diào)試,在這里直接給n和
- // 數(shù)組a賦值,在實(shí)際使用過程中要通過鍵盤讀入它們的值
- 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];
- // 若將下面兩個(gè)語句改為本語句,則程序會(huì)出錯(cuò),因?yàn)榻?jīng)過第1次循環(huán)
- // 后a[k,k]=1,a[k,k]的值發(fā)生了變化,所以在下面的語句中先用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消去法的主要區(qū)別就是在這一步,Gauss消去法是從k+1
- // 到n循環(huán),而Jordan消去法是從1到n循環(huá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列的主元素以及它所在的行號(hào)
- double t, mainElement; // mainElement用于保存主元素的值
- int l; // 用于保存主元素所在的行號(hào)
- // 從第k行到第n行尋找第k列的主元素,記下主元素mainElement和所在的行號(hào)l
- mainElement = Math.Abs(a[k, k]); // 注意別忘了取絕對(duì)值
- 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; // 記下主元素所在的行號(hào)
- }
- }
- // l是主元素所在的行。將l行與k行交換,每行前面的k個(gè)元素都是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#算法應(yīng)用之高斯消元法實(shí)現(xiàn)程序的運(yùn)行結(jié)果:
高斯消去法解方程組的中間過程
中間過程
增廣矩陣:
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#算法應(yīng)用之高斯消元法實(shí)現(xiàn)就向你介紹到這里,希望對(duì)你了解C#算法應(yīng)用以及高斯消元法的實(shí)現(xiàn)有所幫助。
【編輯推薦】