追赶法(Thomas) 雅克比迭代(Jacobi) 高斯迭代(Gauss) 的C++实现

  • 其实如果你搜到了这个博客
    • 基本可以说明,你肯定已经知道什么是追赶法了
    • Python Python 就是大一大二的小孩拿来使自我感觉良好的骗子玩具(对低龄儿童和专业人士除外)

\bg_white \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_4\\ x_5 \end{bmatrix}=\begin{bmatrix} d_1\\ d_2\\ \vdots \\ d_{n-1}\\ d_n \end{bmatrix}


  • LU分解

\bg_white \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}

\left\{\begin{matrix} \gamma_i=a_i\,\,\,\,\,\,\,\,\,\,(i=2,3,4,...,n)\\ b_i=\gamma_i\beta_{i-1}+\alpha_i\,\,\,(i=2,3,4,...,n) \\ c_i=\alpha_i \beta_i\,\,\,\,\,\,\,\,(i=1,2,3,...,n-1) \end{matrix}\right.


  • LU分解后,可以轻松得得到每个方程得解
  • 哪两个方程呢:
    • AX=b
    • LUX=b====>LY=b====>Y=d
    • UX=d====>X

\begin{matrix} y_1=d_1/b_1,y_i=(d_i-a_iy_{i-1})/(b_i-a_i\beta_{i-1}),i=2,3,...,n\\ x_n=y_n,x_i=y_i-\beta_ix_{i+1},i=n-1,n-2,...,1 \end{matrix}

  • C++ 实现
  • 其实有个很有趣的事情,...,这玩意不就是顺下来的...
  • 啊,对对对
#include <iostream>
#include <vector>
using namespace std;

vector<double> THOMAS(vector<vector<double>>a, vector<double>d)
{
	int n = d.size();
	
	vector<double>x(n);
	vector<double>alpha(n);
	vector<double>gamma(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++)
	{
		gamma[i] = a[i][i-1];
		alpha[i] = a[i][i] - gamma[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] = {2,1,0,0}; 
	a[1] = {1,2,1,0}; 
	a[2] = {0,1,2,1}; 
	a[3] = {0,0,1,2};
	b    = {1,1,1,1};
	
	x = THOMAS(a, b);
	
	for (int i=0;i<4;i++)
	{
		for (int j=0;j<4;j++)
		{    
			cout << a[i][j] << " ";
		}
		cout << b[i] << endl;
	}
	cout << "SOLUTION of THOMAS method:" << endl;
	for (int i=0;i<4;i++)
	{
		cout<<"x"<<i+1<<" = " <<x[i] << endl;
	}
} 

显然,这是我们所不能满意的

我们希望的功能有

1.检验是否可以使用THOMAS方法

2.可以从文件中读取,好,明天更

3.明天cupt 裁判


  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

River Chandler

谢谢,我会更努力学习工作的!!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值