數值計算——高斯消去法求解線性方程組(附代碼)

高斯消去法是求解線性方程組常用的直接解法

高斯(Gauss)消去法解方程組的基本思想是用矩陣的行初等變換將係數矩陣約化爲上三角形矩陣,再進行回代求解。

設Ax=b,A \in R^{n\times n},若A的所有順序主子式均不爲零,則基本高斯消元無需換行進行到底,得到唯一解,其消元和回代的計算公式爲:

(1)消元計算     對於 k=1,2,\cdots ,n-1,

m_{ik}=\frac{a_{ik}^{(k)}}{a_{kk}^{(k)}} ,i=k+1,\cdots ,n, 

a_{ij}^{(k+1)}=a_{ij}^{(k)}}-m_{ik}{a_{kj}^{(k)} ,b_{i}^{(k+1)}=b_{i}^{(k)}}-m_{ik}{b_{k}^{(k)} ,i=k+1,\cdots ,n.

(2)回代計算

x_{n}=\frac{b_{n}^{(n)}}{a_{nn}^{(n)}} ,x_{i}=\frac{b_{i}^{(i)}-\sum_{j=i+1}^{n}a_{ij}^{(i)}x_{j}}{a_{ii}^{(i)}},i=n-1,\cdots ,1.

基本高斯消去法c++代碼:此程序編寫的函數用的容器作爲參數傳遞,不用定義A係數的矩陣大小。

#include "pch.h"
#include <iostream>//基本數據流輸入/輸出
#include <iomanip> //參數化輸入/輸出 
#include <vector>//STL動態數組容器
using namespace std;
//************************
//高斯消去法公式
//***********************
vector<double> gaussian_elimination(vector<vector<double>>a, vector<double>b); //高斯消去法求解線性方程組AX=B
vector<double> gaussian_elimination(vector<vector<double>>a, vector<double>b)
{
	int n = size(b);
	vector<double>x;    //定義方程組解
	x.resize(n);
	vector<double>mi_k; //定義消去過程中的中間變量
	mi_k.resize(n);
	double sum;
	for (int i = 0; i < n; i++)
	{
		//判斷能否用高斯消去法
		if (a[i][i] == 0)
		{
			cout << "can't use Gaussian meathod" << endl;
		}
	}
	//n-1步消元
	for (int k = 0; k < n - 1; k++)
	{
		//求出第i次初等行變換系數
		for (int j = k + 1; j < n; j++)
		{
			mi_k[j] = a[j][k] / a[k][k];
		}
		for (int i = k + 1; i < n; i++)
		{
			for (int j = 0; j < n; j++)
			{
				a[i][j] = a[i][j] - mi_k[i] * a[k][j];
			}
			b[i] = b[i] - mi_k[i] * b[k];
		}
	}	//回代過程
	x[n - 1] = b[n - 1] / a[n - 1][n - 1];
	for (int i = n - 2; i >= 0; i--)
	{
		sum = 0;
		for (int j = i + 1; j < n; j++)
		{
			sum = sum + a[i][j] * x[j];
		}
		x[i] = (b[i] - sum) / a[i][i];
	}
	return x;
}
int main()
{
	vector<vector<double>>a;
	a.resize(3, vector<double>(3));
	vector<double>b(3);
	vector<double>x;
	a[0] = { 0.5,1.1,3.1 }, a[1] = { 2.0,4.5,0.36 }, a[2] = { 5.0,0.96,6.5 };
	b = { 6.0,0.02,0.96 };

	x = gaussian_elimination(a, b);
	cout << "解爲:" << endl;
	for (int i = 0; i < 3; i++)
		cout <<"x["<<i<<"]="<< fixed << setprecision(2) << setw(5) << x[i] << endl;
}

運行結果:

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章