数值计算——追赶法求解三对角方程组(附代码)

目录

追赶法基础理论

追赶法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

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