三对角方程组与追赶法:沿着相邻关系求解
把一根均匀细杆的左端维持在
在这个理想模型里,每个内部点的温度等于左右邻点温度的平均。于是,虽然有 4 个未知温度,每条方程只牵涉相邻的两个或三个未知数。把点增加到一万个,这种局部关系也不改变。
先试着给这 4 个点分配温度,再逐点检查是否符合平均关系。可以按位置估计,也可以从一组相同的温度开始修改。需要找到的是让所有点同时平衡的分配;接下来再把这个任务整理成方程,并寻找不必反复试填的计算办法。
从相邻温度看三对角结构
把内部温度依次记为
“等于两侧平均”可以写成
这里假设材料和截面积均匀、节点等距,且没有侧向散热或内部热源。平衡时,相邻等长小段传递的热量相等,温度差也就相等,得到上面的关系。对于更一般的导热问题,系数和右端会改变,不能直接套用“取平均”。
在下面填一组温度,点击“检查当前试算”。读数是各点温度偏离左右邻点平均值的程度,单位仍为 ℃。可以先保留一次结果,再修改偏差较大的位置,比较整组温度是否更接近平衡;修改一个点也会影响邻点,因此只修好一处还不够。
如果暂时没有修改思路,可以逐级展开提示,或直接载入方程组的解;后面的正文也会完整算出结果,不需要先完成试算才能继续阅读。改变右端温度后,可以检验自己发现的分配方式还能否使用。
检查得到的是这组数是否满足局部规则的证据,并不能凭几次改进就保证某种试填策略总能成功。若观察到相邻温差相等,可以将这个猜想代回平均关系核对:
将已知边界移到等号右边,4 条方程为
第一行右端的 0 来自左端温度,最后一行右端的 100 来自右端温度。把系数排列成表,就是系数矩阵;将未知数和右端各排成一列,可以简写成
从左上到右下的
一般的输入长什么样
有
三对角矩阵不必对称,
先向前消掉,再向后算回来
先只看前两条方程:
不必同时猜 4 个温度。先尝试一个更局部的任务:把第一条方程乘以一个数再加到第二条上,能否让第二条里的
第一行的
这叫消元:用一条已知方程消去另一条中的一个未知数。之所以不改变解,是因为新第二行等于“旧第二行加半倍第一行”,反过来再减去半倍第一行就能恢复。
接下来,用新第二行消掉第三行里的
| 处理到哪一行 | 用什么操作消去前一个未知数 | 处理后的该行 |
|---|---|---|
| 第 1 行 | 保留原式 | |
| 第 2 行 | 加上第 1 行的 |
|
| 第 3 行 | 加上新第 2 行的 |
|
| 第 4 行 | 加上新第 3 行的 |
到这里,每条方程中只剩当前未知数和它右边的一个未知数,最后一行更是只剩
下面是这套计算规则的分步演示。点击“下一步”,观察当前行左侧的系数变成 0,主对角和右端怎样更新。完成消元后继续单步,查看“赶”回来的回代过程;也可以切换到非对称例子,观察右端不为零时的更新。它用于核对每一步操作,与开头自行构造温度的任务相互补充。
从最后一行开始,计算顺序为
这叫回代:先算出末端未知数,再将它代入上一行。把
这种针对三对角结构的高斯消去法,称为追赶法,也叫 Thomas 算法。它是两趟有限步骤的直接解法,不是反复猜测直到收敛的迭代法。NPTEL 课程中的 Thomas 算法采用的是先消元、再回代的同一思路。
把手算变成递推公式
用
第一行不需要消元,因此
当第
第
再做“第
消元结束后,第
有些教材会继续把每行除以
为什么消元不会越算越宽
一般矩阵消元时,原本为零的地方可能出现非零数,称为“填充”。这里,在不交换行的前提下,第
每轮操作保持两件事:已处理的行都只含当前及右邻未知数;新方程组与原方程组有相同的解。向前循环处理完第
追赶法与LU分解的对应关系
把所有消元倍数
求解
若同一个
为什么计算量是线性的
令
向前每处理一行,需要一次除法得到
这是本文这组公式的算术操作计数,未计入读写数组、检查输入等开销,也不等于运行毫秒数。它说明求一个右端的总时间为
矩阵也无需保存成
拖动规模,比较保存同一个矩阵需要多少个数,以及本文公式的算术次数。这里不运行大矩阵计算,读数直接由存储长度和计数公式得出。
例如
使用
有唯一解,追赶法也可能走不下去
消元公式反复除以
一个可手算的反例是
第一行直接给出
非零却很小的主元
把左上角的 0 改成一个小数
当
零主元的问题很明确;把它改成非零数以后,计算是否就足够可靠?先看默认的
面板中的解误差是计算结果与上面解析参考值的最大绝对差;残差是将计算结果代回原方程后,左右两侧差的最大绝对值。先观察两项读数,再比较两边的消元倍数;需要时可以展开提示。
若选到
实验使用 JavaScript Number 的双精度浮点运算,显示的小数位数不参与算法。以解析式在双精度下计算的值作为参考;这里
这里的解误差是
本例在
各元素仍有界。因此,这个例子主要揭示不合适的主元造成的算法问题。实际软件会根据矩阵性质选算法;例如 LAPACK 的 DGTSV为一般三对角系统使用带部分选主元的高斯消元。它仍利用带状结构,但换行可能让
哪些条件可以保证主元非零
两个常用的充分条件是:
- 按行严格对角占优:每行都有
,缺失的首尾系数按 0 计。主对角绝对值严格大于同一行其他系数绝对值之和。 - 实对称正定:矩阵对称,且对任意非零实向量
,都有 。这个二次式可以理解为由矩阵定义的一种严格为正的“能量”。
在精确算术中,这两类矩阵都能保证本文消元所需的主元非零。它们是充分条件,不是必要条件;不满足时要继续检查,不能直接断言无解或算法必定失败。仅有非严格的“
两个充分条件的证明,以及温度矩阵为什么适用
严格对角占优。 首行给出
因此每个
实对称正定。 每个左上角
将
温度例子的内部行满足
只要内部向量不全为零,就不可能每个相邻差都为零,所以矩阵正定。还可以直接代入递推得到
非零主元的数学保证,与浮点误差最终有多大,是不同层次的问题。整体尺度、舍入和问题条件性仍会影响计算;将任意小主元硬改成一个固定小数,会改变原方程,不能作为通用修复方式。
一个可以直接运行的实现
下面用 Python 实现正文的不换行版本。数学下标从 1 开始,代码下标从 0 开始;四个输入数组都长为 a[0]=0、c[-1]=0。函数复制输入,保留原系数便于验算。
1 | import math |
这里检测零主元和非有限数,是为了明确报告无法继续的算术步骤;它没有诊断所有小主元风险,也不提供精度保证。对一般输入,应使用带选主元和误差诊断的成熟求解器,而不是仅凭“程序返回了一个数组”判断可靠。
从一维相邻关系到其他问题
回到细杆,改变两个条件,先决定原来的分配规律与求解方法各需怎样调整。判断时可以列出受影响的那一行,不必先算出整个新解。
加入局部热源。 两端仍为 0 ℃、100 ℃,仍有 4 个内部点,但某个已知热源使第二条离散方程改为
核对:局部热源改变了什么
将原解代入第二行,左边仍为 0,已经不等于新的右端 10,因此等温差分配失效。但系数矩阵完全没变,仍是已经证明正定的三对角矩阵,可以继续使用追赶法。右端改为
改成周期连接。 再考虑由至少 3 个节点组成的闭环:第一个节点同时与第二个和最后一个相邻。这是新的周期模型,不再保留细杆两端固定温度的条件。尝试写出第一行和最后一行,检查原来存三条对角线的数组是否还能容纳全部关系。
核对:周期连接为何需要另外处理
若仍使用相邻平均关系,第一行含
一维差分方程、某些三次样条的系数系统,也可能产生三对角方程组。判断能否采用本文的方法,要同时检查相邻关系形成的结构,以及主元条件。二维网格通常会产生更宽的带状或块结构,也不再是每行只有这三个标量系数。
对于本文的细杆模型,解析温度本来就是一条直线,等距节点上的平均关系恰好精确成立;这不意味着所有连续问题离散后都没有误差。追赶法负责解给定的离散方程组,离散方程是否准确描述物理问题,需要另外判断。
当相邻关系确实形成普通三对角结构,且主元条件合适时,每一行只向下一行传递少量信息,两趟扫描就能求解。这也是从矩阵的零元素分布中节省计算和存储的一个具体例子。
参考资料
- NPTEL:Thomas Algorithm for Tridiagonal and Block Tridiagonal Matrices。用于核对算法机制;课程使用归一化形式,本文使用未归一化的
。 - LAPACK:DGTSV 官方文档与源代码。用于核对一般三对角系统的部分选主元策略及第二条上对角线存储。
- ScaLAPACK Users’ Guide:Linear Equations。对照一般带状、可不选主元和正定三对角系统的不同分解;其中并行实现还包含额外置换,不等同于本文的串行两趟扫描。
- Title: 三对角方程组与追赶法:沿着相邻关系求解
- Author: 姜智浩
- Created at : 2026-10-21 17:50:00
- Updated at : 2026-10-21 18:16:36
- Link: https://super-213.github.io/zhihaojiang.github.io/2026/10/21/tridiagonal-thomas/
- License: This work is licensed under CC BY-NC-SA 4.0.
Loading comments…