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

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


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


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

这里写图片描述

A = [ b 1 c 1 a 2 b 2 c 2     a N 1 b N 1 c N 1 a N b N ] , L = [ 1 e 2 1   e N 1 1 e N 1 ]

U = [ f c 1 f 2 c 2 f N 1 c N 1 f N ]

1.首先是计算 f 1
L的第一行乘以 U的第一列,得到 A的第一行第一列的元素,即
1 f 1 = b 1

2.接着计算出每个 e i , f i , i = 2 , 3... N
计算 e 2 :
L的第二行乘以 U的第一列,得到 A第二行第一列的元素,即
e 2 f 1 = a 2

得到 e 2 = a 2 / f 1
计算 e 3 :
L的第三行乘以 U的第二列(乘以第一列为零),得到 A第三行第二列的元素,即
0 c 1 + e 3 f 2 = a 3

得到 e 3 = a 3 / f 2
依次类推~~~
3.计算 f i , i = 2 , 3.. N
L的第二行乘以 U的第二列,得到 A的第二行第二列的元素,即
e 2 c 1 + f 2 = b 2

得到 f 2 = b 2 + e 2 c 1
计算 f 3 :
L的第三行乘以 U的第三列,得到 A的第三行第三列的元素,即
e 3 c 2 + f 3 = b 3

得到 f 3 = b 3 + e 3 c 2

依次类推


计算 y i , i = 1 , 2 , 3 , . . . , N

U = [ f c 1 f 2 c 2 f N 1 c N 1 f N ] , X = [ x 1 x 2 x N ]

Y = [ f c 1 f 2 c 2 f N 1 c N 1 f N ] [ x 1 x 2 x N ] = [ f 1 x 1 c 1 x 2 f 2 x 2 c 2 x 3 f N x N ] = [ y 1 y 2 y N ]

d = [ d 1 d 2 d N ]

这里写图片描述
L
L = [ 1 e 2 1   e N 1 1 e N 1 ]

L Y = d
L的第一行乘以Y,即 1 y 1 = d 1 , y 1 = d 1
L的第二行乘以Y,即 e 2 y 1 + 1 y 2 = d 2 , y 2 = d 2 e 2 y 1
L的第三行乘以Y,即 e 3 y 2 + 1 y 3 = d 3 , y 3 = d 2 e 2 y 2
依次类推,
y i = d i d i y i 1 , i = 2 , 3 , . . . , N


这里写图片描述
计算 x i , i = N , N 1 , . . . , 1
由上面计算出 y i

Y = [ f c 1 f 2 c 2 f N 1 c N 1 f N ] [ x 1 x 2 x N ] = [ f 1 x 1 c 1 x 2 f 2 x 2 c 2 x 3 f N x N ] = [ y 1 y 2 y N ]

从底往上算,
x N f N = y N
x N 1 f N 1 c N 1 x N
…..
x 2 f 2 c 2 x 3
x 1 f 1 c 1 x 2

计算 x i
则有:
x i = ( y i + c i x i + 1 ) / f i , 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

猜你喜欢

转载自blog.csdn.net/qq_35025383/article/details/80821884