數值計算——追趕法求解三對角方程組(附代碼)

目錄

追趕法基礎理論

追趕法c++程序代碼

程序運行結果

源碼文件下載地址


追趕法基礎理論

在數值計算中,對三次樣條曲線插值和用差分方法求解常微分方程邊值問題時,通常會遇到Ax=d三對角形式的方程組:

\begin{bmatrix} b_{1} & c_{1} & & & \\ a_{2} & b_{2} & c_{2} & & \\ & \ddots & \ddots & \ddots & \\ & & a_{n-1} & b_{n-1} & c_{n-1} \\ & & & a_{n} & b_{n} \end{bmatrix}\begin{bmatrix} x_{1}\\ x_{2}\\ \vdots \\ x_{n-1}\\ x_{n} \end{bmatrix}=\begin{bmatrix} d_{1}\\ d_{2}\\ \vdots \\ d_{n-1}\\ d_{n} \end{bmatrix}                                                                                                                 (1)

利用三對角矩陣的LU分解建立計算量更少的線性方程組求解公式,現將係數矩陣A進行克勞特分解,即A分解爲下三角矩陣和單位上三角矩陣的乘積:

\begin{bmatrix} b_{1} & c_{1} & & & \\ a_{2} & b_{2} & c_{2} & & \\ & \ddots & \ddots & \ddots & \\ & & a_{n-1} & b_{n-1} & c_{n-1} \\ & & & a_{n} & b_{n} \end{bmatrix}=\begin{bmatrix} \alpha _{1} && & & \\ \gamma _{2} & \alpha _{2} & & & \\ & \ddots & \ddots & & \\ & & \gamma _{n-1} & \alpha _{n-1} & \\ & & & \gamma _{n} & \alpha _{n} \end{bmatrix}\begin{bmatrix} 1 & \beta _{1} & & & \\& 1 & \beta _{2} & & \\ && \ddots & \ddots & \\ & && 1 & \beta _{n-1} \\ & & & & 1 \end{bmatrix}                                       (2)

計算\alpha _{i},\beta _{i},\gamma _{i},的公式:

\alpha _{1}=b_{1}\beta _{1}=c_{1}/b_{1}

\gamma _{i}=a_{i}\alpha _{i}=b_{i}-a_{i}\beta _{i-1}i=2,3,\cdots n;                                                                                                                 (3)

\beta _{i}=c_{i}/\alpha _{i}

求解Ax=d等價於求解Ly=d和Ux=y.

因而經過推導得到解三對角線性方程組的追趕法公式.

  • 計算\beta _{1}的遞推公式:

          \beta _{1}=c_{1}/b_{1}\beta _{i}=c_{i}/\left ( b_{i}-a_{i}\beta _{i-1} \right )i=2,3,\cdots n-1;                                                                                 (4)

  • 解Ly=d:

         y _{1}=d_{1}/b_{1}y _{i}=\left ( d_{i}-a_{i}y_{i-1} \right )/\left ( b_{i}-a_{i}\beta _{i-1} \right )i=2,3,\cdots n;                                                                      (5)

  • 解Ux=y:

          x_{n}=y_{n}x _{i}= y_{i}-\beta_{i}x_{i+1}i=n-1,n-2,\cdots 1;                                                                                      (6)

整個求解過程是先有(4)式和(5)式計算\beta _{1}\rightarrow \beta _{2}\rightarrow\cdots \rightarrow \beta _{n-1}y _{1}\rightarrow y_{2}\rightarrow\cdots \rightarrow y _{n},這個過程稱爲由前到後“追”的過程;再由(6)式求出x _{n}\rightarrow x_{n-1}\rightarrow\cdots \rightarrow x _{1},這個過程是由後往前“趕”的過程,因此上述解法通常稱爲追趕法。

追趕法c++程序代碼

#include <iostream>
#include <vector>
#include <iomanip> //參數化輸入/輸出 
using namespace std;
//*****************************
 //追趕法求解AX=B矩陣
//*****************************
vector<double> Chasing_method(vector<vector<double>>a, vector<double>d)
{
	int n = size(d);
	vector<double>x(n);
	vector<double>alpha(n);
	vector<double>gama(n);
	vector<double>beta(n);
	vector<double>y(n);
	alpha[0] = a[0][0];
	beta[0] = a[0][1] / a[0][0]; y[0] = d[0] / a[0][0];
	for (int i = 1; i < n; i++)
	{
		gama[i] = a[i ][i - 1];
		alpha[i] = a[i][i] - gama[i] * beta[i - 1];
		if (i < n- 1)
		{
			beta[i] = a[i ][i + 1] / alpha[i];
		}
		y[i] = (d[i] - a[i][i - 1] * y[i - 1]) / alpha[i];
	}
	x[n- 1] = y[n- 1];
	for (int i = n- 2; i >= 0; i--)
	{
		x[i] = y[i] - beta[i] * x[i + 1];
	}
	return x;
}
int main()
{
	vector<vector<double>>a(4, vector<double>(4));
	vector<double>b(4);
	vector<double>x(4);
	a[0] = { 3,4,0,0 }; a[1] = { 1,4,1,0 }; a[2] = { 0,1,6,1 }; a[3] = {0,0,2,8 };
	b = { 10,11,30,48 };
	x = Chasing_method(a, b);
	for (int i = 0; i < 4; i++)
	{
		for (int j = 0; j < 4; j++)
		{    
			cout << fixed << setw(8) << setprecision(4) << a[i][j];
		}
		cout << fixed << setw(8) << setprecision(4) << b[i] << endl;
	}
	cout << "追趕法求解:" << endl;
	for (int i = 0; i < 4; i++)
	{
		cout<<"x"<<i<<"=   " <<x[i] << endl;
	}
}

程序運行結果

源碼文件下載地址

https://download.csdn.net/download/weixin_41788456/11828550

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