10分钟理解托马斯算法(tridiagonal matrix algorithm,Thomas algorithm)

本文详细介绍了如何使用Thomas算法解决三对角线性方程组问题,包括计算过程中的关键步骤,如f和e系数的计算、向前代换和向后代换等,并提供了完整的MATLAB实现代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这里写图片描述
遇到隐式格式,我们需要求解一个线性方程组。怎么办呢?当然是Thomas algorithm


这里写图片描述
注意到第一处箭头。
接着是矩阵化
这里写图片描述
对角占有就可以LU分解
这里写图片描述


重头戏:Thomas algorithm
这里写图片描述

这里写图片描述

A=b1a2c1b2 c2aN1 bN1aNcN1bN,L=1e21 eN11eN1A=[b1−c1−a2b2−c2⋱ ⋱⋱ −aN−1bN−1cN−1−aNbN],L=[1e21⋱ ⋱eN−11eN1]

U=fc1f2c2fN1cN1fNU=[f−c1f2−c2⋱⋱fN−1−cN−1fN]

1.首先是计算f1f1
L的第一行乘以U的第一列,得到A的第一行第一列的元素,即
1f1=b11∗f1=b1

2.接着计算出每个ei,fi,i=2,3...Nei,fi,i=2,3...N
计算e2e2:
L的第二行乘以U的第一列,得到A第二行第一列的元素,即
e2f1=a2e2∗f1=−a2

得到e2=a2/f1e2=−a2/f1
计算e3e3:
L的第三行乘以U的第二列(乘以第一列为零),得到A第三行第二列的元素,即
0c1+e3f2=a30∗−c1+e3∗f2=−a3

得到e3=a3/f2e3=−a3/f2
依次类推~~~
3.计算fi,i=2,3..Nfi,i=2,3..N
L的第二行乘以U的第二列,得到A的第二行第二列的元素,即
e2c1+f2=b2e2∗−c1+f2=b2

得到f2=b2+e2c1f2=b2+e2∗c1
计算f3f3:
L的第三行乘以U的第三列,得到A的第三行第三列的元素,即
e3c2+f3=b3e3∗−c2+f3=b3

得到f3=b3+e3c2f3=b3+e3∗c2

依次类推


计算yi,i=1,2,3,...,Nyi,i=1,2,3,...,N

U=fc1f2c2fN1cN1fN,X=x1x2xNU=[f−c1f2−c2⋱⋱fN−1−cN−1fN],X=[x1x2⋮⋮xN]

Y=fc1f2c2fN1cN1fNx1x2xN=f1x1c1x2f2x2c2x3fNxN=y1y2yNY=[f−c1f2−c2⋱⋱fN−1−cN−1fN]∗[x1x2⋮⋮xN]=[f1∗x1−c1x2f2∗x2−c2x3⋮⋮fN∗xN]=[y1y2⋮⋮yN]

d=d1d2dNd=[d1d2⋮⋮dN]

这里写图片描述
L
L=1e21 eN11eN1L=[1e21⋱ ⋱eN−11eN1]

LY=dL∗Y=d
L的第一行乘以Y,即1y1=d11∗y1=d1,y1=d1y1=d1
L的第二行乘以Y,即e2y1+1y2=d2e2∗y1+1∗y2=d2,y2=d2e2y1y2=d2−e2∗y1
L的第三行乘以Y,即e3y2+1y3=d3e3∗y2+1∗y3=d3,y3=d2e2y2y3=d2−e2∗y2
依次类推,
yi=didiyi1,i=2,3,...,Nyi=di−di∗yi−1,i=2,3,...,N

这里写图片描述
计算xi,i=N,N1,...,1xi,i=N,N−1,...,1
由上面计算出yiyi

Y=fc1f2c2fN1cN1fNx1x2xN=f1x1c1x2f2x2c2x3fNxN=y1y2yNY=[f−c1f2−c2⋱⋱fN−1−cN−1fN]∗[x1x2⋮⋮xN]=[f1∗x1−c1x2f2∗x2−c2x3⋮⋮fN∗xN]=[y1y2⋮⋮yN]

从底往上算,
xNfN=yNxN∗fN=yN
xN1fN1cN1xNxN−1∗fN−1−cN−1∗xN
…..
x2f2c2x3x2∗f2−c2∗x3
x1f1c1x2x1∗f1−c1∗x2

计算xixi
则有:
xi=(yi+cixi+1)/fi,i=N1,N2,...,1xi=(yi+ci∗xi+1)/fi,i=N−1,N−2,...,1
这里写图片描述
这里写图片描述

matlab代码:

function x = thomas(N, a, b, c, d)
e = zeros(N,1);
f = zeros(N,1);
x = zeros(N,1);
y = zeros(N,1);
% compute f_i and e_i
f(1) = b(1);
for i = 2:1:N
e(i) = - a(i)/f(i-1);
f(i) = b(i) + e(i)*c(i-1);
end
% compute y_i
y(1) = d(1);
for i = 2:1:N
y(i) = d(i) - e(i)*y(i-1);
end
% compute x_i
x(N) = y(N)/f(N);
for i = N-1:-1:1
x(i) = (y(i) + c(i)*x(i+1))/f(i);
end
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值