三对角线性方程组(tridiagonal systems of equations)的求解
三对角线性方程组(tridiagonal systems of equations)
三对角线性方程组,对于熟悉数值分析的同学来说,并不陌生,它经常出现在微分方程的数值求解和三次样条函数的插值问题中。三对角线性方程组可描述为以下方程组:
\]
其中\(1\leq i \leq n, a_{1}=0, c_{n}=0.\) 以上方程组写成矩阵形式为\(Ax=d\),即:
{b_{1}}&{c_{1}}&{}&{}&{0}\\
{a_{2}}&{b_{2}}&{c_{2}}&{}&{}\\
{}&{a_{3}}&{b_{3}}&\ddots &{}\\
{}&{}&\ddots &\ddots &{c_{n-1}}\\
{0}&&&{a_{n}}&{b_{n}}\\
\end{bmatrix}}
{\begin{bmatrix}{x_{1}}\\{x_{2}}\\{x_{3}}\\\vdots \\{x_{n}}\\\end{bmatrix}}={\begin{bmatrix}{d_{1}}\\{d_{2}}\\{d_{3}}\\\vdots \\{d_{n}}\\\end{bmatrix}}
\]
三对角线性方程组的求解采用追赶法或者Thomas算法,它是Gauss消去法在三对角线性方程组这种特殊情形下的应用,因此,主要思想还是Gauss消去法,只是会更加简单些。我们将在下面的算法详述中给出该算法的具体求解过程。
当然,该算法并不总是稳定的,但当系数矩阵\(A\)为严格对角占优矩阵(Strictly D iagonally Dominant, SDD)或对称正定矩阵(Symmetric Positive Definite, SPD)时,该算法稳定。对于不熟悉SDD或者SPD的读者,也不必担心,我们还会在我们的博客中介绍这类矩阵。现在,我们只要记住,该算法对于部分系数矩阵\(A\)是可以求解的。
算法详述
追赶法或者Thomas算法的具体步骤如下:
- 创建新系数\(c_{i}^{*}\)和\(d_{i}^{*}\)来代替原先的\(a_{i},b_{i},c_{i}\),公式如下:
\begin{array}{lr}
\frac{c_1}{b_1} & ; i = 1\\
\frac{c_i}{b_i - a_i c^{*}_{i-1}} & ; i = 2,3,...,n-1
\end{array}
\right.\\
d^{*}_i = \left\{
\begin{array}{lr}
\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{array}
\right.
\]
- 改写原先的方程组\(Ax=d\)如下:
1 & c^{*}_1 & 0 & 0 & ... & 0 \\
0 & 1 & c^{*}_2 & 0 & ... & 0 \\
0 & 0 & 1 & c^{*}_3 & 0 & 0 \\
. & . & & & & . \\
. & . & & & & . \\
. & . & & & & c^{*}_{n-1} \\
0 & 0 & 0 & 0 & 0 & 1 \\
\end{bmatrix} \begin{bmatrix}
x_1 \\
x_2 \\
x_3 \\
.\\
.\\
.\\
x_k \\
\end{bmatrix} = \begin{bmatrix}
d^{*}_1 \\
d^{*}_2 \\
d^{*}_3 \\
.\\
.\\
.\\
d^{*}_n \\
\end{bmatrix}
\]
- 计算解向量\(x\),如下:
\]
以上算法得到的解向量\(x\)即为原方程\(Ax=d\)的解。
下面,我们来证明该算法的正确性,只需要证明该算法保持原方程组的形式不变。
首先,当\(i=1\)时,
\]
当\(i>1\)时,
(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实现
我们将要求解的线性方程组如下:
4&1&{0}&{0}&{0}\\
{1}&{4}&{1}&{0}&{0}\\
{0}&{1}&{4}&{1}&{0}\\
{0}&{0}&{1}&{4}&{1}\\
{0}&{0}&{0}&{1}&{4}\\
\end{bmatrix}}
{\begin{bmatrix}{x_{1}}\\{x_{2}}\\{x_{3}}\\{x_{4}} \\{x_{5}}\\\end{bmatrix}}={\begin{bmatrix}{1\\0.5\\ -1\\3\\2}\\\end{bmatrix}}
\]
接下来,我们将用Python来实现该算法,函数为TDMA,输入参数为列表a,b,c,d, 输出为解向量x,代码如下:
# use Thomas Method to solve tridiagonal linear equation
# algorithm reference: https://en.wikipedia.org/wiki/Tridiagonal_matrix_algorithm
import numpy as np
# parameter: a,b,c,d are list-like of same length
# tridiagonal linear equation: Ax=d
# b: main diagonal of matrix A
# a: main diagonal below of matrix A
# c: main diagonal upper of matrix A
# d: Ax=d
# return: x(type=list), the solution of Ax=d
def TDMA(a,b,c,d):
try:
n = len(d) # order of tridiagonal square matrix
# use a,b,c to create matrix A, which is not necessary in the algorithm
A = np.array([[0]*n]*n, dtype='float64')
for i in range(n):
A[i,i] = b[i]
if i > 0:
A[i, i-1] = a[i]
if i < n-1:
A[i, i+1] = c[i]
# new list of modified coefficients
c_1 = [0]*n
d_1 = [0]*n
for i in range(n):
if not i:
c_1[i] = c[i]/b[i]
d_1[i] = d[i] / b[i]
else:
c_1[i] = c[i]/(b[i]-c_1[i-1]*a[i])
d_1[i] = (d[i]-d_1[i-1]*a[i])/(b[i]-c_1[i-1] * a[i])
# x: solution of Ax=d
x = [0]*n
for i in range(n-1, -1, -1):
if i == n-1:
x[i] = d_1[i]
else:
x[i] = d_1[i]-c_1[i]*x[i+1]
x = [round(_, 4) for _ in x]
return x
except Exception as e:
return e
def main():
a = [0, 1, 1, 1, 1]
b = [4, 4, 4, 4, 4]
c = [1, 1, 1, 1, 0]
d = [1, 0.5, -1, 3, 2]
'''
a = [0, 2, 1, 3]
b = [1, 1, 2, 1]
c = [2, 3, 0.5, 0]
d = [2, -1, 1, 3]
'''
x = TDMA(a, b, c, d)
print('The solution is %s'%x)
main()
运行该程序,输出结果为:
The solution is [0.2, 0.2, -0.5, 0.8, 0.3]
本算法的Github地址为: https://github.com/percent4/Numeric_Analysis/blob/master/TDMA.py .
最后再次声明,追赶法或者Thomas算法并不是对所有的三对角矩阵都是有效的,只是部分三对角矩阵可行。
参考文献
- https://www.quantstart.com/articles/Tridiagonal-Matrix-Solver-via-Thomas-Algorithm
- https://en.wikipedia.org/wiki/Tridiagonal_matrix_algorithm
- https://wenku.baidu.com/view/336bafa3daef5ef7ba0d3ccc.html
三对角线性方程组(tridiagonal systems of equations)的求解的更多相关文章
- 三对角矩阵(Tridiagonal Matrices)的求法:Thomas Algorithm(TDMA)
转载http://www.cnblogs.com/xpvincent/archive/2013/01/25/2877411.html 做三次样条曲线时,需要解三对角矩阵(Tridiagonal Mat ...
- Sherman-Morrison公式及其应用
Sherman-Morrison公式 Sherman-Morrison公式以 Jack Sherman 和 Winifred J. Morrison命名,在线性代数中,是求解逆矩阵的一种方法.本篇 ...
- Guass列主元、平方根法、追赶法求解方程组的C++实现
一,要解决的问题 选用合适的算法,求解三种线性方程组:一般线性方程组,对称正定方程组,三对角线性方程组. 方程略. 二,数值方法 1,使用Guass列主元消去法求解一般线性方程组. Guass列主元是 ...
- 《Fluid Engine Development》 学习笔记1-求解线性方程组
我个人对基于物理的动画很感兴趣,最近在尝试阅读<Fluid Engine Development>,由于内容涉及太多的数学问题,而单纯学习数学又过于枯燥,难以坚持学习(我中途放弃好多次了) ...
- <<Numerical Analysis>>笔记
2ed, by Timothy Sauer DEFINITION 1.3A solution is correct within p decimal places if the error is l ...
- <Numerical Analysis>(by Timothy Sauer) Notes
2ed, by Timothy Sauer DEFINITION 1.3A solution is correct within p decimal places if the error is l ...
- Maple拥有优秀的符号计算和数值计算能力
https://www.maplesoft.com/products/maple/ Maple高级应用和经典实例: https://wenku.baidu.com/view/f246962107221 ...
- [转]BLAS简介
BLAS(Basic Linear Algebra Subprograms)是一组线性代数计算中通用的基本运算操作函数集合[1] .BLAS Technical (BLAST) Forum负责规范BL ...
- MP算法和OMP算法及其思想
主要介绍MP(Matching Pursuits)算法和OMP(Orthogonal Matching Pursuit)算法[1],这两个算法尽管在90年代初就提出来了,但作为经典的算法,国内文献(可 ...
随机推荐
- Linux安装yum
方法/步骤 1 查看.卸载已安装的yum包 查看已安装的yum包 #rpm –qa|grep yum 卸载软件包 #rpm –e –nodeps yum 2 下载安装依赖包python python- ...
- 秒杀系统-service
在Dao层我们只完成了针对表的相关操作,包括写了接口方法和映射文件中的sql语句,并没有编写逻辑的代码,例如对多个Dao层方法的拼接,当我们用户成功秒杀商品时我们需要进行商品的减库存操作(调用Seck ...
- java安全与加解密
1 安全 安全性相关内容分为认证.授权和审计(发现安全问题时可以查看相关历史记录) 用户认证 java API表示主体的是javax.security.auth.Subject类型,表示用户身份标识的 ...
- Coding能力提升小技巧
一.使用变量的一般原则 1.变量初始化原则: 通常在变量声明时初始化; 在靠近变量第一次使用的位置初始化; 在类的构造函数里初始化变量. 2.作用域: 使变量引用局部化,即把引用到变量的地方尽可能集中 ...
- 迁移桌面程序到MS Store(5)——.NET Standard
接下来的几篇,我想讨论下迁移桌面程序到MS Store,可以采用的比较常见.通用性比较强的实施步骤和分层架构. 通常商业项目一般都是不断的迭代,不太可能突然停止更新现有的桌面版本,然后花很长时间从头来 ...
- 背水一战 Windows 10 (78) - 自定义控件: 基础知识, 依赖属性, 附加属性
[源码下载] 背水一战 Windows 10 (78) - 自定义控件: 基础知识, 依赖属性, 附加属性 作者:webabcd 介绍背水一战 Windows 10 之 控件(自定义控件) 自定义控件 ...
- Alpha代码规范、冲刺任务与计划
Alpha代码规范.冲刺任务与计划 团队名称: 云打印 作业要求: Alpha代码规范.冲刺任务与计划 作业目标:代码规范.冲刺任务与计划. 团队队员 队员学号 队员姓名 个人博客地址 备注 2216 ...
- 文件上传和WAF的攻与防
Author:JoyChouDate:20180613 1. 前言 本文的测试环境均为 nginx/1.10.3 PHP 5.5.34 有些特性和 语言及webserver有关,有问题的地方,欢迎大家 ...
- Java学习笔记51(综合项目:家庭记账系统)
javaEE的开发模式 1.什么是模式 模式在开发过程中总结出的“套路”,总结出的一套约定俗成的设计模式 2.javaEE经历的模式 model1模式: 技术组成:jsp+javaBean model ...
- idea : shorten command line
[官方文档]:IntelliJ IDEA 2017.3 EAP: Configurable command line shortener and more 如果类路径太长,或者有许多VM参数,程序就无 ...