追赶法基础理论
追赶法c++程序代码
程序运行结果
源码文件下载地址
在数值计算中,对三次样条曲线插值和用差分方法求解常微分方程边值问题时,通常会遇到Ax=d三对角形式的方程组:
(1)
利用三对角矩阵的LU分解建立计算量更少的线性方程组求解公式,现将系数矩阵A进行克劳特分解,即A分解为下三角矩阵和单位上三角矩阵的乘积:
(2)
计算
的公式:
,
,
,
; (3)
求解Ax=d等价于求解Ly=d和Ux=y.
因而经过推导得到解三对角线性方程组的追赶法公式.
- 计算
的递推公式:
,
,
; (4)
- 解Ly=d:
,
,
; (5)
- 解Ux=y:
,
,
; (6)
整个求解过程是先有(4)式和(5)式计算和
,这个过程称为由前到后“追”的过程;再由(6)式求出
,这个过程是由后往前“赶”的过程,因此上述解法通常称为追赶法。
#include
#include
#include //参数化输入/输出
using namespace std;
//*****************************
//追赶法求解AX=B矩阵
//*****************************
vector Chasing_method(vector>a, vectord)
{
int n = size(d);
vectorx(n);
vectoralpha(n);
vectorgama(n);
vectorbeta(n);
vectory(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>a(4, vector(4));
vectorb(4);
vectorx(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"<
https://download.csdn.net/download/weixin_41788456/11828550