目錄
追趕法基礎理論
在數值計算中,對三次樣條曲線插值和用差分方法求解常微分方程邊值問題時,通常會遇到Ax=d三對角形式的方程組:
(1)
利用三對角矩陣的LU分解建立計算量更少的線性方程組求解公式,現將係數矩陣A進行克勞特分解,即A分解爲下三角矩陣和單位上三角矩陣的乘積:
(2)
計算的公式:
,
,,; (3)
求解Ax=d等價於求解Ly=d和Ux=y.
因而經過推導得到解三對角線性方程組的追趕法公式.
- 計算的遞推公式:
,,; (4)
- 解Ly=d:
,,; (5)
- 解Ux=y:
,,; (6)
整個求解過程是先有(4)式和(5)式計算和,這個過程稱爲由前到後“追”的過程;再由(6)式求出,這個過程是由後往前“趕”的過程,因此上述解法通常稱爲追趕法。
追趕法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;
}
}