Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
W. T. Lee
MS6021, Scientific Computation, University of Limerick
The Thomas algorithm is an efficient way of solving tridiagonal matrix systems. It is based on LU decomposition in which the matrix system M x = r is rewritten as LU x = r where L is a lower triangular matrix and
U is an upper triangular matrix. The system can be efficiently solved by setting U x = and then solving first
L = r for and then U x = for x. The Thomas algorithm consists of two steps. In Step 1 decomposing the
matrix into M = LU and solving L = r are accomplished in a single downwards sweep, taking us straight
from M x = r to U x = . In step 2 the equation U x = is solved for x in an upwards sweep.
I. STAGE 1
0
0
0
c1
b2
a3
0
0
0
0
c2
b3
a4
0
0
0
0
c3
b4
a5
0
0
0
0
c4
b5
a6
0
x1
r1
0 x2 r2
0 x3 r3
=
0 x4 r4
c5 x5 r5
x6
r6
b6
Row 2 a2 x1 +
b2 x2 +c2 x3 = r2
a2 1 x 2
= a2 1
a2 Row 1 a2 x1 +
New Row 2
(b2 a2 1 ) x2 +c2 x3 = r2 a2 1
Divide through by (b2 a2 1 ) to get
x1 +
c2
r2 a2 1
x2 =
b2 a 2 1
b2 a 2 1
2 =
c2
,
b2 a 2 1
2 =
r2 a2 1
.
b2 a 2 1
Row 1
1
0
0
0
b1 x1 + c1 x2 = r1
Divide through by b1
x1 +
c1
r1
x2 =
b1
b1
1
1
a3
0
0
0
0
2
b3
a4
0
0
0
0
c3
b4
a5
0
0
0
0
c4
b5
a6
0
x1
1
0 x2 2
0 x3 r3
=
0
x4 r4
c5 x5 r5
b6
x6
r6
Rewrite:
x1 + 1 x2 = 1 ,
1
a2
0
0
0
1
b2
a3
0
0
0
0
c2
b3
a4
0
0
0
0
c3
b4
a5
0
1 =
0
0
0
c4
b5
a6
c1
,
b1
1 =
r1
b1
0
x1
1
0 x2 r2
0 x3 r3
=
0 x4 r4
c5 x5 r5
b6
r6
x6
Row 2.
Row 3.
a3 x2 + b3 x3 + c3 x4 = r3
Use a3 times row 2 of the matrix to eliminate the first term
a3 (x2 + 2 x3 = 2 )
Row 3 a3 x2 +
b3 x3 +c3 x4 = r3
a3 Row 2 a3 x2 +
a3 2 x 3
= a3 2
New Row 3
(b3 a3 2 ) x3 +c3 x4 = r3 a3 2
Divide through by (b3 a3 2 ) to get
a2 x1 + b2 x2 + c2 x3 = r2
x2 +
Use a2 times row 1 of the matrix to eliminate the first term
a2 (x1 + 1 x2 = 1 )
http://www3.ul.ie/wlee;
william.lee@ul.ie
c3
r3 a3 2
x3 =
b3 a 3 2
b3 a 3 2
3 =
c3
,
b3 a 3 2
3 =
r3 a3 2
.
b3 a 3 2
1
0
0
0
1
1
0
0
0
0
0
2
1
a4
0
0
0
0
3
b4
a5
0
0
0
0
c4
b5
a6
0
x1
1
x
0
2 2
0 x3 3
=
0
x4 r4
c5 x5 r5
r6
b6
x6
Row 4.
1
0
0
0
1
1
0
0
0
0
0
2
1
0
0
0
0
0
3
1
0
0
0
0
0
4
1
a6
0
x1
1
x
0
2 2
0 x3 3
=
0
x4 4
5 x5 5
x6
b6
r6
Row 6
a4 x3 + b4 x4 + c4 x5 = r4
a6 x5 + b6 x6 = r6
a4 (x3 + 3 x4 = 3 )
a6 x5 + a6 5 x6 = a6 5
b4 x4 +c4 x5 = r4
Row 4 a4 x3 +
a4 Row 3 a4 x3 +
a4 3 x 4
= a4 3
New Row 4
(b4 a4 3 ) x4 +c4 x5 = r4 a4 3
Resulting in
(b6 a6 5 ) x6 = r6 a6 5
Divide through by b6 a6 5 to get
x6 = 6 ,
c4
r4 a4 3
x3 +
x4 =
b4 a 4 3
b4 a 4 3
We can rewrite this as
x4 + 4 x5 = 4 ,
1
0
0
0
1
1
0
0
0
0
4 =
0
2
1
0
0
0
0
0
3
1
a5
0
c4
,
b4 a 4 3
0
0
0
4
b5
a6
4 =
r4 a4 3
.
b4 a 4 3
0
x1
1
x
0
2 2
0 x3 3
=
0
x4 4
c5 x5 r5
b6
x6
r6
1
0
0
0
1
1
0
0
0
0
0
2
1
0
0
0
0
0
3
1
0
0
6 =
0
0
0
4
1
0
r6 a6 5
b6 a 6 5
0
x1
1
x
0
2 2
0 x3 3
=
0
x4 4
5 x5 5
1
x6
Row 5.
a5 x4 + b5 x5 + c5 x6 = r5
Use a5 times row 4 of the matrix to eliminate the first term
a5 (x4 + 4 x5 = 4 )
b5 x5 +c5 x6 = r5
Row 5 a5 x4 +
a5 Row 4 a5 x4 +
a5 4 x 5
= a5 4
New Row 5
(b5 a5 4 ) x5 +c5 x6 = r5 a5 4
Divide through by (b5 a5 4 ) to get
x4 +
c5
r5 a5 4
x5 =
b5 a 5 4
b5 a 5 4
5 =
c5
,
b5 a 5 4
5 =
r5 a5 4
.
b5 a 5 4
1
0
0
0
1
1
0
0
0
0
0
2
1
0
0
0
0
0
3
1
0
0
0
0
0
4
1
0
0
x1
1
x
0
2 2
0 x3 3
=
0
x4 4
5 x5 5
1
x6
3
Row 5: x5 + 5 x6 = 5 .
Rearrange to get: x5 = 5 5 x6 .
1
0
0
0
1
1
0
0
0
0
0
2
1
0
0
0
0
0
3
1
0
0
0
0
0
4
1
0
Row 1: x1 + 1 x2 = 1 .
Rearrange to get: x1 = 1 1 x2 .
0
x1
1
x
0
2
2
0 x3 3
=
0
x4 4
5 x5 5
1
x6
Row 4: x4 + 4 x5 = 4 .
Rearrange to get: x4 = 4 4 x5 .
1
0
0
0
1
1
0
0
0
0
0
2
1
0
0
0
0
0
3
1
0
0
0
0
0
4
1
0
0
x1
1
x
0
2
2
0 x3 3
=
0
x4 4
5 x5 5
1
x6
1
0
0
0
1
1
0
0
0
0
0
2
1
0
0
0
0
0
3
1
0
0
0
0
0
4
1
0
0
x1
1
x
0
2
2
0 x3 3
=
0
x4 4
5 x5 5
1
x6
Row 3: x3 + 3 x4 = 3 .
Rearrange to get: x3 = 3 3 x4 .
1
0
0
0
1
1
0
0
0
0
0
2
1
0
0
0
0
0
3
1
0
0
0
0
0
4
1
0
0
x1
1
0
x2 2
0 x3 3
=
0
x4 4
5 x5 5
1
6
x6
Row 2: x2 + 2 x3 = 2 .
Rearrange to get: x2 = 2 2 x3 .
1
0
0
0
1
1
0
0
0
0
0
2
1
0
0
0
0
0
3
1
0
0
0
0
0
4
1
0
0
x1
1
0 x2 2
0 x3 3
=
0
x4 4
5 x5 5
6
1
x6
The Thomas algorithm is used because it is fast and because tridiagonal matrices often occur in practice. (This argument is slightly circular because people often manipulate
the problems they are working on to reduce them to solving a
tridiagonal matrix problem.) Although it is rare, the algorithm
can be unstable if bi ai i1 is zero or numerically zero for
any i. This will occur if the tridiagonal matrix is singular, but
in rare cases can occur if it is non-singular. The condition for
the algorithm to be stable is
kbi k > kai k + kci k
for all i. The matrix problems which result from the discretisation of partial differential equations nearly all satisfy this
criterion.
If the algorithm is numerically unstable then you must rearrange the equations: known as pivoting. Standard LU decomposition algorithms for full or banded matrices include
pivoting. (But first you should check to make sure you have
not made a mistake in formulating the problem.)