700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > 数值计算——追赶法求解三对角方程组(附代码)

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

时间:2020-09-02 20:43:20

相关推荐

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

目录

追赶法基础理论

追赶法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)式求出,这个过程是由后往前“赶”的过程,因此上述解法通常称为追赶法。

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

程序运行结果

源码文件下载地址

/download/weixin_41788456/11828550

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。