遇到隐式格式,我们需要求解一个线性方程组。怎么办呢?当然是Thomas algorithm
注意到第一处箭头。
接着是矩阵化:
对角占有就可以LU分解
重头戏:Thomas algorithm
A=⎡⎣⎢⎢⎢⎢⎢⎢⎢b1−a2−c1b2⋱ −c2⋱−aN−1⋱ bN−1−aNcN−1bN⎤⎦⎥⎥⎥⎥⎥⎥⎥,L=⎡⎣⎢⎢⎢⎢⎢⎢⎢1e21⋱ ⋱eN−11eN1⎤⎦⎥⎥⎥⎥⎥⎥⎥
U=⎡⎣⎢⎢⎢⎢⎢⎢⎢f−c1f2−c2⋱⋱fN−1−cN−1fN⎤⎦⎥⎥⎥⎥⎥⎥⎥
1.首先是计算
f1
L
的第一行乘以
U
的第一列,得到
A
的第一行第一列的元素,即
1∗f1=b1
2.接着计算出每个
ei,fi,i=2,3...N
计算
e2
:
L
的第二行乘以
U
的第一列,得到
A
第二行第一列的元素,即
e2∗f1=−a2
得到
e2=−a2/f1
计算
e3
:
L
的第三行乘以
U
的第二列(乘以第一列为零),得到
A
第三行第二列的元素,即
0∗−c1+e3∗f2=−a3
得到
e3=−a3/f2
依次类推~~~
3.计算
fi,i=2,3..N
L
的第二行乘以
U
的第二列,得到
A
的第二行第二列的元素,即
e2∗−c1+f2=b2
得到
f2=b2+e2∗c1
计算
f3
:
L
的第三行乘以
U
的第三列,得到
A
的第三行第三列的元素,即
e3∗−c2+f3=b3
得到
f3=b3+e3∗c2
依次类推
计算
yi,i=1,2,3,...,N
U=⎡⎣⎢⎢⎢⎢⎢⎢⎢f−c1f2−c2⋱⋱fN−1−cN−1fN⎤⎦⎥⎥⎥⎥⎥⎥⎥,X=⎡⎣⎢⎢⎢⎢⎢⎢⎢⎢x1x2⋮⋮xN⎤⎦⎥⎥⎥⎥⎥⎥⎥⎥
Y=⎡⎣⎢⎢⎢⎢⎢⎢⎢f−c1f2−c2⋱⋱fN−1−cN−1fN⎤⎦⎥⎥⎥⎥⎥⎥⎥∗⎡⎣⎢⎢⎢⎢⎢⎢⎢⎢x1x2⋮⋮xN⎤⎦⎥⎥⎥⎥⎥⎥⎥⎥=⎡⎣⎢⎢⎢⎢⎢⎢⎢⎢f1∗x1−c1x2f2∗x2−c2x3⋮⋮fN∗xN⎤⎦⎥⎥⎥⎥⎥⎥⎥⎥=⎡⎣⎢⎢⎢⎢⎢⎢⎢⎢y1y2⋮⋮yN⎤⎦⎥⎥⎥⎥⎥⎥⎥⎥
d=⎡⎣⎢⎢⎢⎢⎢⎢⎢⎢d1d2⋮⋮dN⎤⎦⎥⎥⎥⎥⎥⎥⎥⎥
由
L
的
L=⎡⎣⎢⎢⎢⎢⎢⎢⎢1e21⋱ ⋱eN−11eN1⎤⎦⎥⎥⎥⎥⎥⎥⎥
L∗Y=d
L的第一行乘以Y,即
1∗y1=d1
,
y1=d1
L的第二行乘以Y,即
e2∗y1+1∗y2=d2
,
y2=d2−e2∗y1
L的第三行乘以Y,即
e3∗y2+1∗y3=d3
,
y3=d2−e2∗y2
依次类推,
yi=di−di∗yi−1,i=2,3,...,N
计算
xi,i=N,N−1,...,1
由上面计算出
yi
Y=⎡⎣⎢⎢⎢⎢⎢⎢⎢f−c1f2−c2⋱⋱fN−1−cN−1fN⎤⎦⎥⎥⎥⎥⎥⎥⎥∗⎡⎣⎢⎢⎢⎢⎢⎢⎢⎢x1x2⋮⋮xN⎤⎦⎥⎥⎥⎥⎥⎥⎥⎥=⎡⎣⎢⎢⎢⎢⎢⎢⎢⎢f1∗x1−c1x2f2∗x2−c2x3⋮⋮fN∗xN⎤⎦⎥⎥⎥⎥⎥⎥⎥⎥=⎡⎣⎢⎢⎢⎢⎢⎢⎢⎢y1y2⋮⋮yN⎤⎦⎥⎥⎥⎥⎥⎥⎥⎥
从底往上算,
xN∗fN=yN
,
xN−1∗fN−1−cN−1∗xN
…..
x2∗f2−c2∗x3
x1∗f1−c1∗x2
计算
xi
则有:
xi=(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);
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
y(1) = d(1);
for i = 2:1:N
y(i) = d(i) - e(i)*y(i-1);
end
x(N) = y(N)/f(N);
for i = N-1:-1:1
x(i) = (y(i) + c(i)*x(i+1))/f(i);
end