浅谈三对角线性方程组的解法

 背景

        作为一名非数学专业本科生。在大一大二学习了高等数学、线性代数等课程,对微分方程的数值求解等问题有了一些初步的认识。在本学期开设的计算机辅助几何技术基础中,我们学习了样条曲线、Bezier曲线、B样条曲线等知识。我发现许多式子的求解都会转化为三对角线性方程组的求解。故本篇文章就是我对于该问题的解决方法的一些整理,以及在我们的专业课程——CAGD中的应用,并谈谈自己的理解。

        为何要探讨这个问题,源于我们CAGD课程老师云笔记中的一个B样条曲线的例题:

浅谈三对角线性方程组的解法_第1张图片

        这让我想起了我们好像不止一次遇到过三对角线性方程组的问题。所以就有了这篇文章的由来。(其实我只是个搬运工)

 

三对角线性方程组(tridiagonal systems of equations)     

        三对角线性方程组可描述为以下方程组: 

a_{i}x_{i-1}+b_{i}x_{i}+c_{i}x_{i+1} = d_{i}

         其中1\leq i\leq n,a_{1}=0,c_{n}=0 ,以上方程组写成矩阵形式为Ax = b,即:

浅谈三对角线性方程组的解法_第2张图片

         三对角线性方程组的求解采用追赶法或者Thomas算法,它是Gauss消去法在三对角线性方程组这种特殊情形下的应用,因此,主要思想还是Gauss消去法,只是会更加简单些。我们将在下面的算法详述中给出该算法的具体求解过程。 

        我们平时接触的最多的方法应该也就是追赶法了,该算法对于部分系数矩阵A是可以求解的。所以以下先给出追赶法的实现方法。

算法详述

        追赶法或者Thomas算法的具体步骤如下:

1、创建新系数c_{i}^{*}d_{i}^{*}来代替原来的a_{i},b_{i},c_{i},公式如下:

c_{i}^{*}=\left\{\begin{matrix} \frac{c_{1}}{b_{1}}\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ;i = 1\\ \frac{c_{i}}{b_{i}-a_{i}c_{i-1}^{*}};i = 2,3,...,n-1 \end{matrix}\right.

d_{i}^{*}=\left\{\begin{matrix} \frac{d_{1}}{b_{1}}\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ;i = 1\\ \frac{d_{i}-a_{i}d_{i-1}^{*}}{b_{i}-a_{i}c_{i-1}^{*}};i = 2,3,...,n-1 \end{matrix}\right.

2、改写原先的方程组Ax = b如下:

浅谈三对角线性方程组的解法_第3张图片

(ps:小白实在不会打latex的矩阵了呜呜,在学了!)

 3、计算解向量x,如下:

x_{n} = d_{n}^{*},x_{i} = d_{i}^{*}-c_{i}^{*}x_{i+1}, i = n-1,n-2,...,2,1

        以上算法得到的解向量x即为原方程Ax=b的解。

        下面,我们来证明该算法的正确性,只需要证明该算法保持原方程组的形式不变。 
        首先,当i = 1时, 

1 \ast x_{1}+c_{1}^{*} x_{2} = d_{*}^{1}\Leftrightarrow 1\ast x_{1}+\frac{c_{1}}{b_{1}}x_{2} = \frac{d_{1}}{b_{1}}\Leftrightarrow b_{1}\ast x_{1}+c_{1}x_{2} = d_{1}

        当i>1时,

1 \ast x_{i}+c_{1}^{*} x_{2} = d_{*}^{1}\Leftrightarrow 1\ast x_{i}+\frac{c_{i}}{b_{i}-a_{i}c_{i-1}^{*}}x_{i+1} = \frac{d_{i}-a_{i}d_{i-1}^{*}}{b_{i}-a_{i}c_{i-1}^{*}}\Leftrightarrow (b_{i}-a_{i}c_{i-1}^{*})x_{i}+c_{i}x_{i+1} = d_{i}-a_{i}d_{i-1}^{*}

结合a_{i}x_{i-1}+b_{i}x_{i}+c_{i}x_{i+1} = d_{i},只需要证明x_{i-1}+c_{i-1}^{*}x_{i} = d_{i-1}^{*},而这已经在算法的第(3)步计算x_{i-1}中给出,故证明完毕。

Python实现

见三对角线性方程组(tridiagonal systems of equations)的求解_山阴少年-CSDN博客_三对角方程组

个人小结

        事实上,Matlab的强大功能已经赋予我们解决任何矩阵问题的能力(毕竟是Matrix Laboratory)。在我们解决实际问题的时候,我们会因为有了许多强大的工具软件之后减少了对许多问题的思考。而在我看来,勤于思考,敢于深入研究问题,我们才能学的更多更好!

参考文献

1、三对角线性方程组(tridiagonal systems of equations)的求解_山阴少年-CSDN博客_三对角方程组

2、(这个是我老师的云笔记的一道例题)https://note.youdao.com/ynoteshare/index.html?id=cd95875775b4496be166eb077a70a0b0&type=note&_time=1639060051484

你可能感兴趣的:(线性代数)