FVM in CFD 学习笔记_第10章_求解代数方程组系统

学习自F. Moukalled, L. Mangani, M. Darwish所著The Finite Volume Method in Computational Fluid Dynamics - An Advanced Introduction with OpenFOAM and Matlab
Chapter 10 Solving the System of Algebraic Equations

离散过程将会生成线性方程组系统, A ϕ = b \bold A \boldsymbol \phi = \bold b Aϕ=b,其中未知量 ϕ \boldsymbol \phi ϕ位于网格单元形心上,是待求量。该系统中,未知变量的系数构成了矩阵 A \bold A A,其由线性化过程和网格几何量导出,而向量 b \bold b b则包含了源项、常数项、边界条件和非线性分量。

求解线性方程组系统的技术通常被分为直接方法和迭代方法,每类又有很多具体方法。由于流动问题是高度非线性的,从其线性化过程得到的系数通常是依赖于解的,因此,在每步的迭代过程中并不需要得到非常精确的解,所以直接解法在CFD的应用中很少使用。最常用的还是迭代解法,因为它们更适合求解该类问题,其在每步迭代中所需内存更小,计算消耗更小。

本章首先讲解在结构和非结构网格上的一些直接解法(Gauss消元、LU分解、三对角和五对角矩阵算法),以便为在CFD应用中更加广泛使用的迭代方法提供基础。然后回顾一些基本的迭代解法(含预处理和不含预处理)的特性和局限性,包括Jacobi、Gauss-Seidel、不完全LU分解、以及共轭梯度(CG)方法。最后,简要讲讲多重网格方法,它通常是和迭代方法联合使用,以克服这些迭代方法的局限性。

1 引言

线性求解器求解的是如下形式的代数方程组
A ϕ = b \bold A \boldsymbol \phi = \bold b Aϕ=b
其中 A \bold A A是单元的系数矩阵 a i j a_{ij} aij ϕ \boldsymbol \phi ϕ是未知变量 ϕ \phi ϕ的向量,而 b \bold b b则是源项 b i b_i bi的矢量。使用矩阵编号,该方程的展开形式为
[ a 11 a 12 . . . a 1   N − 1 a 1   N a 21 a 22 . . . a 2   N − 1 a 2   N . . . . . . . . . . . . . . . a N 1 a N 2 . . . a N   N − 1 a N   N ] [ ϕ 1 ϕ 2 . . . ϕ N − 1 ϕ N ] = [ b 1 b 2 . . . b N − 1 b N ] \begin{bmatrix} a_{11} & a_{12} & ... & a_{1~N-1} & a_{1~N} \\ a_{21} & a_{22} & ... & a_{2~N-1} & a_{2~N} \\ ... & ... & ... & ... & ... \\ a_{N1} & a_{N2} & ... & a_{N~N-1} & a_{N~N} \end{bmatrix} \begin{bmatrix} \phi_1 \\ \phi_2 \\ ... \\ \phi_{N-1} \\ \phi_N \end{bmatrix} = \begin{bmatrix} b_1 \\ b_2 \\ ... \\ b_{N-1} \\ b_N \end{bmatrix} a11a21...aN1a12a22...aN2............a1 N1a2 N1...aN N1a1 Na2 N...aN Nϕ1ϕ2...ϕN1ϕN=b1b2...bN1bN
一般来说呢,矩阵 A \bold A A中的每一行代表计算域1个单元上定义的方程,非0系数是与该单元紧邻的邻居单元的,系数 a i j a_{ij} aij反映的是存储在 i i i单元控制体形心的 ϕ i \phi_i ϕi与其邻近单元形心的 ϕ j \phi_j ϕj的关系紧密程度。由于一个单元只和少数几个单元相邻,且其邻接关系是与离散区域上单元的剖分编码方式相关的,所以大部分的系数实际上是0,这就使得矩阵 A \bold A A总是个稀疏矩阵(即,非零元素的个数很少,在整体矩阵中占比很小,绝大多数的元素都是0)。更进一步,如果用的是结构化的网格,那么矩阵 A \bold A A将会是带状矩阵,即,其仅含几条非零的对角线元素。因此,求解该类系统时,可针对其特性选用对应的高效方法。

如上所述,求解代数方程组系统的方法可以大体上分为两大类,即直接和迭代方法。在直接方法中,矩阵 A \bold A A求逆,解 ϕ \bold\phi ϕ通过 ϕ = A − 1 b \bold\phi=\bold A^{-1}\bold b ϕ=A1b来求出。当矩阵 A \bold A A非常大的时候,应用直接线性解法来求解CFD问题是不切实际的,因为这些CFD问题通常包含非线性系统方程, 即它们的系数是与解相关联的,那么使用迭代方法是切合实际的。

另一方面,在迭代代数解法中,求解算法将重复多次直至达到预期的收敛水平,而不需要在每次迭代的过程中都获得完全收敛的解。

接下来,首先展示一些应用于结构和非结构网格的直接解法,紧接着是结构网格上带状矩阵的高效解法,该章的重点是,迭代线性代数求解器,它们已经被广为证明是在FVM中最有效的和最经济的方法,而且已经被包含进几乎所有有限体积代码的线性求解器中。

2 直接或Gauss消元方法

尽管直接方法并非求解线性代数方程组中稀疏系统的高效方法(它们的计算消耗实在是大的离谱),然而对于它们的讨论可为后续高效的迭代方法的引入铺平道路,所以还是讲一下为好。最简单的直接方法是Gauss消元方法,将被首先介绍。使用Gauss消元法时,将系统转化成等效的上三角系统,这激发了下三角上三角分解方法(LU分解方法),将随后介绍。该方法中,矩阵 A \bold A A将被分解成两个矩阵 L \bold L L U \bold U U的乘积,其中 L \bold L L是下三角矩阵,而 U \bold U U是上三角矩阵。该过程也被称为LU因子分解。此外,还将讨论应用于从结构网格所推出的带状矩阵 A \bold A A的直接方法。

2.1 Gauss消元

假设有如下2变量 ϕ 1 \phi_1 ϕ1 ϕ 2 \phi_2 ϕ2的线性方程组
a 11 ϕ 1 + a 12 ϕ 2 = b 1   a 21 ϕ 1 + a 22 ϕ 2 = b 2 a_{11}\phi_1+a_{12}\phi_2=b_1 \\ ~\\ a_{21}\phi_1+a_{22}\phi_2=b_2 a11ϕ1+a12ϕ2=b1 a21ϕ1+a22ϕ2=b2
为了消去 ϕ 1 \phi_1 ϕ1,将第1个式子乘上 a 21 / a 11 a_{21}/a_{11} a21/a11,并减去第2个式子,可得
( a 22 − a 21 a 11 a 12 ) ϕ 2 = b 2 − a 21 a 11 b 1 \left(a_{22}-\frac{a_{21}}{a_{11}}a_{12}\right)\phi_2=b_2-\frac{a_{21}}{a_{11}}b_1 (a22a11a21a12)ϕ2=b2a11a21b1
从而可以直接求得 ϕ 2 \phi_2 ϕ2
ϕ 2 = b 2 − a 21 a 11 b 1 a 22 − a 21 a 11 a 12 \phi_2=\frac {b_2-\displaystyle\frac{a_{21}}{a_{11}}b_1} {a_{22}-\displaystyle\frac{a_{21}}{a_{11}}a_{12}} ϕ2=a22a11a21a12b2a11a21b1
再把这个求得的 ϕ 2 \phi_2 ϕ2代入到方程最初的第1个式子里,可以求得 ϕ 1 \phi_1 ϕ1的值
ϕ 1 = b 1 a 11 − a 12 a 11 b 2 − a 21 a 11 b 1 a 22 − a 21 a 11 a 12 \phi_1=\frac{b_1}{a_{11}}-\frac{a_{12}}{a_{11}}\frac {b_2-\displaystyle\frac{a_{21}}{a_{11}}b_1} {a_{22}-\displaystyle\frac{a_{21}}{a_{11}}a_{12}} ϕ1=a11b1a11a12a22a11a21a12b2a11a21b1
上述过程实际上分成了2步,第1步是消去1个未知量,得到仅剩1个未知量的方程,求解该方程,可得该未知量的值;第2步是将该未知量回代到原方程中,求出剩余未知量的值。即,消元-回代,同样的思路也可用于N个变量的线性代数方程组。

2.2&2.3 前向消元Forward Elimination

直接给出算法流程

for k = 1 to N - 1
{
	for i = k + 1 to N	
	{
		Ratio = a_ik / a_ kk
		for j = k + 1 to N
		{
			a_ij = a_ij - Ratio * a_kj
		}
		b_i = b_i - Ratio * b_k
	}
}

2.4&2.5 反向回代Backward Substitution

直接给出算法流程

phi_N = b_N / a_NN
for i = N - 1 to 1
{
	Term = 0
	for j = i + 1 to N
	{
		Term = Term + a_ij * phi_j
	}
	phi_i = (b_i - Term) / a_ii
}

为防止被0除,消元的时候可选用最大行主元,并互换两行的位置。实际上,Gauss消元回代的方法计算量是非常大的,对于一个N个方程的线性系统,其计算量与 N 3 / 3 N^3/3 N3/3成正比,其中回代过程仅仅占了 N 2 / 2 N^2/2 N2/2,这样高的计算消耗迫使人们针对稀疏矩阵系统寻求更加高效的解法。

2.6 LU分解

求解线性代数方程组的另一个直接解法是LU或PLU(P即前面所讲的行主元选择过程),咱这里就讲讲LU就好了。LU实际上是Gauss方法的变种,LU方法比Gauss消元方法的优势在于,一旦LU分解执行之后,对于右端项 b \bold b b不同的线性系统就想求解多少次就求解多少次,而不需要再做消元处理了(相当于把第1次的消元处理做了LU分解),然而在Gauss消元方法中,消元是始终需要进行的。

基于前面消元处理过程,是将原本的矩阵 A \bold A A转化为上三角矩阵,即
[ u 11 u 12 u 13 . . . u 1   N − 1 u 1   N 0 u 22 u 23 . . . u 2   N − 1 u 2   N 0 0 u 33 . . . u 3   N − 1 u 3   N . . . . . . . . . . . . . . . . . . 0 0 0 . . . 0 u N   N ] [ ϕ 1 ϕ 2 ϕ 3 . . . ϕ N ] = [ c 1 c 2 c 3 . . . c N ] \begin{bmatrix} u_{11} & u_{12} & u_{13} & ... & u_{1~N-1} & u_{1~N} \\ 0 & u_{22} & u_{23} &... & u_{2~N-1} & u_{2~N} \\ 0 & 0 & u_{33} & ... & u_{3~N-1} & u_{3~N} \\ ... & ... & ... & ... & ... & ... \\ 0 & 0 & 0 & ... & 0 & u_{N~N} \end{bmatrix} \begin{bmatrix} \phi_1 \\ \phi_2 \\ \phi_3 \\ ... \\ \phi_N \end{bmatrix} = \begin{bmatrix} c_1 \\ c_2 \\ c_3 \\ ... \\ c_N \end{bmatrix} u1100...0u12u220...0u13u23u33...0...............u1 N1u2 N1u3 N1...0u1 Nu2 Nu3 N...uN Nϕ1ϕ2ϕ3...ϕN=c1c2c3...cN
使用缩写形式,即
U ϕ − c = 0 \bold U \boldsymbol \phi - \bold c = \bold 0 Uϕc=0
L \bold L L为单位下三角矩阵(对角线上的元素是1),即
L = [ 1 0 0 . . . 0 0 l 21 1 0 . . . 0 0 l 31 l 32 1 . . . 0 0 . . . . . . . . . . . . . . . . . . l N 1 l N 2 l N 3 . . . l N   N − 1 1 ] \bold L = \begin{bmatrix} 1 & 0 & 0 & ... & 0 & 0 \\ l_{21} & 1 & 0 & ... & 0 & 0 \\ l_{31} & l_{32} & 1 & ... & 0 & 0 \\ ... & ... & ... & ... & ... & ... \\ l_{N1} & l_{N2} & l_{N3} & ... & l_{N~N-1} & 1 \end{bmatrix} L=1l21l31...lN101l32...lN2001...lN3...............000...lN N1000...1
将方程 U ϕ − c = 0 \bold U \boldsymbol \phi - \bold c = \bold 0 Uϕc=0左乘以 L \bold L L,则变回了最初的方程
L ( U ϕ − c ) = L U ϕ − L c = A ϕ − b \bold L(\bold U \boldsymbol \phi - \bold c) = \bold L \bold U \boldsymbol \phi - \bold L \bold c=\bold A \boldsymbol \phi - \bold b L(Uϕc)=LUϕLc=Aϕb
这样,变得到
L U = A \bold L \bold U = \bold A LU=A

L c = b \bold L \bold c = \bold b Lc=b
即,矩阵 A \bold A A写成了下三角和上三角矩阵的乘积形式,即 L U LU LU分解。

2.7 分解步骤

L U = A \bold L \bold U = \bold A LU=A写成展开形式
[ 1 0 0 . . . 0 0 l 21 1 0 . . . 0 0 l 31 l 32 1 . . . 0 0 . . . . . . . . . . . . . . . . . . l N 1 l N 2 l N 3 . . . l N   N − 1 1 ] [ u 11 u 12 u 13 . . . u 1   N − 1 u 1   N 0 u 22 u 23 . . . u 2   N − 1 u 2   N 0 0 u 33 . . . u 3   N − 1 u 3   N . . . . . . . . . . . . . . . . . . 0 0 0 . . . 0 u N   N ] = [ a 11 a 12 a 13 . . . a 1   N − 1 a 1   N a 21 a 22 a 23 . . . a 2   N − 1 a 2   N a 31 a 32 a 33 . . . a 3   N − 1 a 3   N . . . . . . . . . . . . . . . . . . a N 1 a N 2 a N 3 . . . a N   N − 1 a N   N ] \begin{bmatrix} 1 & 0 & 0 & ... & 0 & 0 \\ l_{21} & 1 & 0 & ... & 0 & 0 \\ l_{31} & l_{32} & 1 & ... & 0 & 0 \\ ... & ... & ... & ... & ... & ... \\ l_{N1} & l_{N2} & l_{N3} & ... & l_{N~N-1} & 1 \end{bmatrix} \begin{bmatrix} u_{11} & u_{12} & u_{13} & ... & u_{1~N-1} & u_{1~N} \\ 0 & u_{22} & u_{23} &... & u_{2~N-1} & u_{2~N} \\ 0 & 0 & u_{33} & ... & u_{3~N-1} & u_{3~N} \\ ... & ... & ... & ... & ... & ... \\ 0 & 0 & 0 & ... & 0 & u_{N~N} \end{bmatrix} = \begin{bmatrix} a_{11} & a_{12} & a_{13} & ... & a_{1~N-1} & a_{1~N} \\ a_{21} & a_{22} & a_{23} &... & a_{2~N-1} & a_{2~N} \\ a_{31} & a_{32} & a_{33} &... & a_{3~N-1} & a_{3~N} \\ ... & ... & ... & ... & ... & ... \\ a_{N1} & a_{N2} & a_{N3} & ... & a_{N~N-1} & a_{N~N} \end{bmatrix} 1l21l31...lN101l32...lN2001...lN3...............000...lN N1000...1u1100...0u12u220...0u13u23u33...0...............u1 N1u2 N1u3 N1...0u1 Nu2 Nu3 N...uN N=a11a21a31...aN1a12a22a32...aN2a13a23a33...aN3...............a1 N1a2 N1a3 N1...aN N1a1 Na2 Na3 N...aN N
L \bold L L的第1行和 U \bold U U的每一列(第1到N列)相乘,得到
u 1 j = a 1 j      j = 1 , 2 , 3 , . . . , N u_{1j}=a_{1j}~~~~j=1,2,3,...,N u1j=a1j    j=1,2,3,...,N
接下来,让 L \bold L L的第2到第N行与 U \bold U U的第1列相乘,得到
l i 1 u 11 = a i 1 ⇒ l i 1 = a i 1 u 11      i = 2 , 3 , . . . , N l_{i1}u_{11}=a_{i1}\Rightarrow l_{i1}=\frac{a_{i1}}{u_{11}}~~~~i=2,3,...,N li1u11=ai1li1=u11ai1    i=2,3,...,N
重复该过程,让 L \bold L L的第2行与 U \bold U U的第2到第N列相乘,得到
l 21 u 1 j + u 2 j = a 2 j ⇒ u 2 j = a 2 j − l 21 u 1 j      j = 2 , 3 , . . . , N l_{21}u_{1j}+u_{2j}=a_{2j} \Rightarrow u_{2j}=a_{2j} - l_{21}u_{1j}~~~~j=2,3,...,N l21u1j+u2j=a2ju2j=a2jl21u1j    j=2,3,...,N
然后呢,再把 L \bold L L的第3到N行与 U \bold U U的第2列相乘,得到
l i 1 u 12 + l i 2 u 22 = a i 2 ⇒ l i 2 = a i 2 − l i 1 u 12 u 22      i = 3 , 4 , . . . , N l_{i1}u_{12}+l_{i2}u_{22}=a{i2} \Rightarrow l_{i2}=\frac{a{i2}-l_{i1}u_{12}}{u_{22}}~~~~i=3,4,...,N li1u12+li2u22=ai2li2=u22ai2li1u12    i=3,4,...,N
如此不断重复,直至解出所有 L \bold L L U \bold U U的元素值。

一般来说, L \bold L L的第i行与 U \bold U U的第i到第N列相乘,可得
u i j = a i j − ∑ k = 1 i − 1 l i k u k j      j = i , i + 1 , . . . , N u_{ij}=a_{ij}-\sum_{k=1}^{i-1}l_{ik}u_{kj}~~~~j=i,i+1,...,N uij=aijk=1i1likukj    j=i,i+1,...,N
L \bold L L的第i+1到第N行与 U \bold U U的第i列相乘,则可得
l k i = a k i − ∑ j = 1 i − 1 l k j u j i u i i      k = i + 1 , i + 2 , . . . , N l_{ki}=\frac{a_{ki}-\sum_{j=1}^{i-1}l_{kj}u_{ji}}{u_{ii}}~~~~k=i+1,i+2,...,N lki=uiiakij=1i1lkjuji    k=i+1,i+2,...,N
对于 L \bold L L的第N行,其系数与 U \bold U U的第N列相乘后,得到
u N N = a N N − ∑ k = 1 N − 1 l N k u k N u_{NN}=a_{NN}-\sum_{k=1}^{N-1}l_{Nk}u_{kN} uNN=aNNk=1N1lNkukN
LU分解的算法汇总如下

2.8 LU分解算法

for j = 1 to N
	u_1j = a_1j
for i = 2 to N
	l_i1 = a_i1 / u_11
for i = 2 to N-1
{
	for j = i to N
	{
		sum = 0
		for k = 1 to i-1
			sum += l_ik * u_kj
		u_ij = a_ij - sum
	}
	for k = i+1 to N
	{
		sum = 0
		for j = 1 to i-1
			sum += l_kj * u_ji
		l_ki = (a_ki - sum) / u_ii
	}
}
sum = 0
for i = 1 to N-1
	sum += l_Ni * u_iN
u_NN = a_NN - sum

2.9 回代步

把原矩阵 A \bold A A分解为 L \bold L L U \bold U U之后,方程系统可分两步来求解( U ϕ = c ,   L c = b \bold U \boldsymbol \phi = \bold c,~\bold L \bold c = \bold b Uϕ=c, Lc=b),两步方法等效于求解两个线性系统方程,然而却由于 L \bold L L U \bold U U的上下三角形式而极大简化了求解过程。

第1步是求解 L c = b \bold L \bold c = \bold b Lc=b,通过前向回代,可以直接得出
c 1 = b 1 c i = b i − ∑ j = 1 i − 1 l i j c j , i = 2 , 3 , . . . , N \begin{aligned} & c_1 = b_1 \\ & c_i = b_i - \sum_{j=1}^{i-1}l_{ij}c_j,\quad\quad i=2,3,...,N \end{aligned} c1=b1ci=bij=1i1lijcj,i=2,3,...,N

第2步是求解 U ϕ = c \bold U \boldsymbol \phi = \bold c Uϕ=c,采用反向回代,可以直接得到
ϕ N = C N u N N ϕ i = c i − ∑ j = i + 1 N u i j ϕ j u i i , i = N − 1 , N − 2 , . . . , 3 , 2 , 1 \begin{aligned} & \phi_N = \frac{C_N}{u_{NN}} \\ & \phi_i = \frac{c_i - \displaystyle \sum_{j=i+1}^{N}u_{ij}\phi_j}{u_{ii}},\quad\quad i=N-1,N-2,...,3,2,1 \end{aligned} ϕN=uNNCNϕi=uiicij=i+1Nuijϕj,i=N1,N2,...,3,2,1

实际上, L \bold L L U \bold U U的元素可以直接存放在最初的矩阵 A \bold A A中,如果 A \bold A A不再需要的话(当LU分解完成后, A \bold A A的确是没啥用了,求解的时候只用 L \bold L L U \bold U U就行了)。对于 N × N N\times N N×N维矩阵执行LU分解需要的计算量是 2 N 3 / 3 2N^3/3 2N3/3,是用Gauss消元法求解线性代数方程组的两倍!然而,LU分解的优势就在于,只用做一次分解,就可以把同样的矩阵 A \bold A A应用于不同的右端项 b \bold b b来求解各种问题。然而,这里LU分解引入的另一个目的,是在于用它来引出其它更加高效的迭代解法。

2.10 LU分解和Gauss消元

也许并不明显,但是在Guass消元的过程中,悄然完成了LU分解。前向消元过程生成了上三角矩阵 U \bold U U,在此过程中,下三角矩阵 L \bold L L也悄悄算好了,因为 L \bold L L的元素实际上就是在消元过程中各行乘上的那个因子。下面的算法,将在Gauss消元的基础上,同时完成LU分解。那么用这个算法显然更方便些哈。

2.11 由Gauss消元来做LU分解的算法

如果把 L \bold L L U \bold U U放在原来的矩阵 A \bold A A中,那么直接这么做就好了,相当于在Gauss消元的算法中,把系数存放到了下三角位置上,注意,不需要对 b \bold b b做处理,因为LU分解就是为了求解不同的右端项 b \bold b b

for k = 1 to N-1
{
	for i = k+1 to N
	{
		a_ik = a_ik / a_kk
		for j = k+1 to N
			a_ij = a_ij - a_ik * a_kj
	}
}

如果 L \bold L L U \bold U U另外找地方放,还要保留矩阵 A \bold A A的话,那么直接把矩阵 A \bold A A复制一份出来,还用上面的算法就行了。


例1 用LU分解方法求解如下线性代数方程组
[ 3 − 1 0 0 − 2 6 − 1 0 0 − 2 6 − 1 0 0 − 2 7 ] [ ϕ 1 ϕ 2 ϕ 3 ϕ 4 ] = [ 3 4 5 − 3 ] \begin{bmatrix} 3 & -1 & 0 & 0 \\ -2 & 6 & -1 & 0 \\ 0 & -2 & 6 & -1 \\ 0 & 0 & -2 & 7 \\ \end{bmatrix} \begin{bmatrix} \phi_1 \\ \phi_2 \\ \phi_3 \\ \phi_4 \end{bmatrix} =\begin{bmatrix} 3 \\ 4 \\ 5 \\ -3 \end{bmatrix} 3200162001620017ϕ1ϕ2ϕ3ϕ4=3453


求解过程从略,答案直接给出
L = [ 1 0 0 0 − 2 3 1 0 0 0 − 3 8 1 0 0 0 − 16 45 1 ] , U = [ 3 − 1 0 0 0 16 3 − 1 0 0 0 45 8 − 1 0 0 0 299 45 ] \bold L=\begin{bmatrix} 1 & 0 & 0 & 0 \\ -\displaystyle\frac{2}{3} & 1 & 0 & 0 \\ 0 & -\displaystyle\frac{3}{8} & 1 & 0 \\ 0 & 0 & -\displaystyle\frac{16}{45} & 1 \\ \end{bmatrix}, \quad\quad \bold U =\begin{bmatrix} 3 & -1 & 0 & 0 \\ 0 & \displaystyle\frac{16}{3} & -1 & 0 \\ 0 & 0 & \displaystyle\frac{45}{8} & -1 \\ 0 & 0 & 0 & \displaystyle\frac{299}{45} \\ \end{bmatrix} L=132000183000145160001,U=300013160001845000145299
c = [ 3 6 29 / 4 − 19 / 45 ] , ϕ = [ 435 / 299 408 / 299 382 / 299 − 19 / 299 ] \bold c=\begin{bmatrix} 3 \\ 6 \\ 29/4\\ -19/45 \end{bmatrix},\quad\quad \boldsymbol \phi=\begin{bmatrix} 435/299 \\ 408/299 \\ 382/299 \\ -19/299 \end{bmatrix} c=3629/419/45,ϕ=435/299408/299382/29919/299


2.12 带状稀疏矩阵的直接解法

Gauss消元和LU分解适用于任何方程组系统,当然,它们可以用于求解从结构或非结构网格的守恒方程离散得出的控制方程组。当使用结构网格时,离散过程得到的系统方程的非零元素仅存在于少数几个对角线上,依据不同的离散框架,常出现三对角或五对角矩阵,对于它们的求解可以提出更加高效的方法。实际上相当于把Gauss消元法应用于这类特定的问题中而已。

2.13 三对角矩阵算法(TDMA)

在这里插入图片描述

一维问题导出的方程往往具有三对角形式,即
a i ϕ i + b i ϕ i + 1 + c i ϕ i − 1 = d i , i = 1 , 2 , 3 , . . . , N , c 1 = b N = 0 a_i \phi_i + b_i \phi_{i+1}+c_i \phi_{i-1} = d_i, \quad\quad i=1,2,3,...,N, \quad\quad c_1=b_N=0 aiϕi+biϕi+1+ciϕi1=di,i=1,2,3,...,N,c1=bN=0
对于 i = 1 i=1 i=1,可直接推得 ϕ 1 \phi_1 ϕ1 ϕ 2 \phi_2 ϕ2的关系
i = 1 ⇒ a 1 ϕ 1 = − b 1 ϕ 2 + d 1 ⇒ ϕ 1 = − b 1 a 1 ϕ 2 + d 1 a 2 i=1 \Rightarrow a_1\phi_1=-b_1\phi_2 + d_1 \Rightarrow \phi_1=-\frac{b_1}{a_1}\phi_2+\frac{d_1}{a_2} i=1a1ϕ1=b1ϕ2+d1ϕ1=a1b1ϕ2+a2d1
同样对于 i = 2 i=2 i=2,可导出 ϕ 2 \phi_2 ϕ2 ϕ 3 \phi_3 ϕ3的关系
i = 2 ⇒ a 2 ϕ 2 = − b 2 ϕ 3 − c 2 ϕ 1 + d 2 ⇒ ϕ 2 = − a 1 b 2 a 1 a 2 − c 2 b 1 ϕ 3 + d 2 a 1 − c 2 d 1 a 1 a 2 − c 2 b 1 i=2 \Rightarrow a_2\phi_2 = -b_2\phi_3 - c_2\phi_1 + d_2 \Rightarrow \phi_2=-\frac{a_1b_2}{a_1a_2-c_2b_1}\phi_3 + \frac{d_2a_1-c_2d_1}{a_1a_2-c_2b_1} i=2a2ϕ2=b2ϕ3c2ϕ1+d2ϕ2=a1a2c2b1a1b2ϕ3+a1a2c2b1d2a1c2d1
同样的操作可用于 ϕ 3 \phi_3 ϕ3 ϕ N \phi_N ϕN,假设 ϕ i \phi_i ϕi可用 ϕ i + 1 \phi_{i+1} ϕi+1表示为
ϕ i = P i ϕ i + 1 + Q i , i = 1 , 2 , 3 , . . . , N \phi_i = P_i \phi_{i+1} + Q_i,\quad\quad i=1,2,3,...,N ϕi=Piϕi+1+Qi,i=1,2,3,...,N
假设对 i − 1 i-1 i1上式已知,那么对 i i i的推导如下
ϕ i − 1 = P i − 1 ϕ i + Q i − 1 a i ϕ i + b i ϕ i + 1 + c i ϕ i − 1 = d i } ⇒ ϕ i = − b i a i + c i P i − 1 ϕ i + 1 + d i − c i Q i − 1 a i + c i P i − 1 \left. \begin{matrix} \phi_{i-1}=P_{i-1}\phi_i + Q_{i-1} \\ a_i \phi_i + b_i \phi_{i+1}+c_i \phi_{i-1} = d_i \end{matrix} \right\} \Rightarrow \phi_i=-\frac{b_i}{a_i+c_iP_{i-1}}\phi_{i+1}+\frac{d_i-c_iQ_{i-1}}{a_i+c_iP_{i-1}} ϕi1=Pi1ϕi+Qi1aiϕi+biϕi+1+ciϕi1=di}ϕi=ai+ciPi1biϕi+1+ai+ciPi1diciQi1
从而推得 P i P_i Pi Q i Q_i Qi
P i = − b i a i + c i P i − 1 Q i = d i − c i Q i − 1 a i + c i P i − 1 i = 2 , 3 , 4 , . . . , N P_i=-\frac{b_i}{a_i+c_iP_{i-1}} \quad\quad Q_i=\frac{d_i-c_iQ_{i-1}}{a_i+c_iP_{i-1}} \quad\quad i=2,3,4,...,N Pi=ai+ciPi1biQi=ai+ciPi1diciQi1i=2,3,4,...,N
对于 i = 1 i=1 i=1,可直接算得 P 1 P_1 P1 Q 1 Q_1 Q1
P 1 = − b 1 a 1 Q 1 = d 1 a 2 P_1=-\frac{b_1}{a_1}\quad\quad Q_1=\frac{d_1}{a_2} P1=a1b1Q1=a2d1
而对于 i = N i=N i=N,由于 b N = 0 b_N=0 bN=0,有
b N = 0 ⇒ P N = 0 ⇒ ϕ N = Q N b_N=0\Rightarrow P_N=0 \Rightarrow \phi_N=Q_N bN=0PN=0ϕN=QN
TDMA算法总结如下

  1. 计算 P 1 P_1 P1 Q 1 Q_1 Q1,用
    P 1 = − b 1 a 1 Q 1 = d 1 a 2 P_1=-\frac{b_1}{a_1}\quad\quad Q_1=\frac{d_1}{a_2} P1=a1b1Q1=a2d1
  2. 计算 P i P_i Pi Q i Q_i Qi i = 2 , 3 , . . . , N i=2,3,...,N i=2,3,...,N,用
    P i = − b i a i + c i P i − 1 Q i = d i − c i Q i − 1 a i + c i P i − 1 P_i=-\frac{b_i}{a_i+c_iP_{i-1}} \quad\quad Q_i=\frac{d_i-c_iQ_{i-1}}{a_i+c_iP_{i-1}} Pi=ai+ciPi1biQi=ai+ciPi1diciQi1
  3. 求出 ϕ N \phi_N ϕN,用
    ϕ N = Q N \phi_N=Q_N ϕN=QN
  4. 反向依次求出 ϕ i \phi_i ϕi i = N − 1 , N − 2 , . . . , 3 , 2 , 1 i=N-1,N-2,...,3,2,1 i=N1,N2,...,3,2,1,用
    ϕ i = P i ϕ i + 1 + Q i , i = N − 1 , N − 2 , . . . , 3 , 2 , 1 \phi_i = P_i \phi_{i+1} + Q_i,\quad\quad i=N-1,N-2,...,3,2,1 ϕi=Piϕi+1+Qi,i=N1,N2,...,3,2,1

2.14 五对角矩阵算法(PDMA)

还是1维问题,只不过离散格式用的精度更高,让i节点与i+1,i+2,i-1,i-2都有关系,这样子出来的离散矩阵便是5对角形式了,即
a i ϕ i + b i ϕ i + 2 + c i ϕ i + 1 + d i ϕ i − 1 + e i ϕ i − 2 = f i i = 1 , 2 , 3 , . . . , N a_i\phi_i+b_i\phi_{i+2}+c_i\phi_{i+1}+d_i\phi_{i-1}+e_i\phi_{i-2}=f_i\quad\quad i=1,2,3,...,N aiϕi+biϕi+2+ciϕi+1+diϕi1+eiϕi2=fii=1,2,3,...,N
对于边界的几个节点,有
d 1 = e 1 = e 2 = 0 b N − 1 = b N = c N = 0 d_1=e_1=e_2=0 \\ b_{N-1}=b_{N}=c_{N}=0 d1=e1=e2=0bN1=bN=cN=0
对于 i = 1 i=1 i=1,有
ϕ 1 = − b 1 a 1 ϕ 3 − c 1 a 1 ϕ 2 + f 1 a 1 \phi_1=-\frac{b_1}{a_1}\phi_3-\frac{c_1}{a_1}\phi_2+\frac{f_1}{a_1} ϕ1=a1b1ϕ3a1c1ϕ2+a1f1
对于 i = 2 i=2 i=2,有
ϕ 2 = − a 1 b 2 a 1 a 2 − d 2 c 1 ϕ 4 − a 1 c 2 − b 1 d 2 a 1 a 2 − d 2 c 1 ϕ 3 + a 1 f 2 − d 2 f 1 a 1 a 2 − d 2 c 1 \phi_2=-\frac{a_1b_2}{a_1a_2-d_2c_1}\phi_4-\frac{a_1c_2-b_1d_2}{a_1a_2-d_2c_1}\phi_3+\frac{a_1f_2-d_2f_1}{a_1a_2-d_2c_1} ϕ2=a1a2d2c1a1b2ϕ4a1a2d2c1a1c2b1d2ϕ3+a1a2d2c1a1f2d2f1
该过程可重复下去,获取第 i i i个变量 ϕ i \phi_i ϕi的通有形式
ϕ i = P i ϕ i + 2 + Q i ϕ i + 1 + R i i = 1 , 2 , 3 , . . . , N \phi_i=P_i\phi_{i+2}+Q_i\phi_{i+1}+R_i\quad\quad i=1,2,3,...,N ϕi=Piϕi+2+Qiϕi+1+Rii=1,2,3,...,N
ϕ i − 1 \phi_{i-1} ϕi1 ϕ i − 2 \phi_{i-2} ϕi2已知的情况下,可求得 ϕ i \phi_i ϕi的形式为
ϕ i = − b i a i + e i P i − 2 + ( d i + e i Q i − 2 ) Q i − 1 ϕ i + 2 − c i + ( d i + e i Q i − 2 ) P i − 1 a i + e i P i − 2 + ( d i + e i Q i − 2 ) Q i − 1 ϕ i + 1 − f i − e i R i − 2 − ( d i + e i Q i − 2 ) R i − 1 a i + e i P i − 2 + ( d i + e i Q i − 2 ) Q i − 1 \begin{aligned} \phi_i=&-\frac{b_i}{a_i+e_iP_{i-2}+(d_i+e_iQ_{i-2})Q_{i-1}}\phi_{i+2} \\ &-\frac{c_i+(d_i+e_iQ_{i-2})P_{i-1}}{a_i+e_iP_{i-2}+(d_i+e_iQ_{i-2})Q_{i-1}}\phi_{i+1} \\ &-\frac{f_i-e_iR_{i-2}-(d_i+e_iQ_{i-2})R_{i-1}}{a_i+e_iP_{i-2}+(d_i+e_iQ_{i-2})Q_{i-1}} \end{aligned} ϕi=ai+eiPi2+(di+eiQi2)Qi1biϕi+2ai+eiPi2+(di+eiQi2)Qi1ci+(di+eiQi2)Pi1ϕi+1ai+eiPi2+(di+eiQi2)Qi1fieiRi2(di+eiQi2)Ri1
比较可得
P i = − b i a i + e i P i − 2 + ( d i + e i Q i − 2 ) Q i − 1 Q i = − c i + ( d i + e i Q i − 2 ) P i − 1 a i + e i P i − 2 + ( d i + e i Q i − 2 ) Q i − 1 R i = − f i − e i R i − 2 − ( d i + e i Q i − 2 ) R i − 1 a i + e i P i − 2 + ( d i + e i Q i − 2 ) Q i − 1 P_i=-\frac{b_i}{a_i+e_iP_{i-2}+(d_i+e_iQ_{i-2})Q_{i-1}} \\ Q_i= -\frac{c_i+(d_i+e_iQ_{i-2})P_{i-1}}{a_i+e_iP_{i-2}+(d_i+e_iQ_{i-2})Q_{i-1}} \\ R_i= -\frac{f_i-e_iR_{i-2}-(d_i+e_iQ_{i-2})R_{i-1}}{a_i+e_iP_{i-2}+(d_i+e_iQ_{i-2})Q_{i-1}} Pi=ai+eiPi2+(di+eiQi2)Qi1biQi=ai+eiPi2+(di+eiQi2)Qi1ci+(di+eiQi2)Pi1Ri=ai+eiPi2+(di+eiQi2)Qi1fieiRi2(di+eiQi2)Ri1
前两个节点,即 i = 1 , 2 i=1,2 i=1,2的值为
P 1 = − b 1 a 1 , Q 1 = − c 1 a 1 , R 1 = f 1 a 1 P 2 = − b 2 a 2 + d 2 Q 1 , Q 2 = − c 2 + d 2 P 1 a 2 + d 2 Q 1 , R 2 = f 2 − d 2 R 1 a 2 + d 2 Q 1 \begin{aligned} & P_1 = -\frac{b_1}{a_1},\quad Q_1=-\frac{c_1}{a_1},\quad R_1=\frac{f_1}{a_1} \\ & P_2 = -\frac{b_2}{a_2+d_2Q_1}, \quad Q_2 = -\frac{c_2+d_2P_1}{a_2+d_2Q_1}, \quad R_2 = \frac{f_2-d_2R_1}{a_2+d_2Q_1} \end{aligned} P1=a1b1,Q1=a1c1,R1=a1f1P2=a2+d2Q1b2,Q2=a2+d2Q1c2+d2P1,R2=a2+d2Q1f2d2R1
由于 b N − 1 = b N = c N = 0 b_{N-1}=b_{N}=c_{N}=0 bN1=bN=cN=0,所以 P N − 1 = P N = Q N = 0 P_{N-1}=P_N=Q_N=0 PN1=PN=QN=0,那么 ϕ N \phi_N ϕN ϕ N − 1 \phi_{N-1} ϕN1的方程为
ϕ N = R N ϕ N − 1 = Q N − 1 ϕ N + R N − 1 \begin{aligned} & \phi_N=R_N \\ & \phi_{N-1}=Q_{N-1}\phi_N+R_{N-1} \end{aligned} ϕN=RNϕN1=QN1ϕN+RN1
将PDMA算法的流程汇总如下

  1. 计算 P 1 ,   Q 1 ,   R 1 ,   P 2 ,   Q 2 ,   R 2 P_1,~Q_1,~R_1,~P_2,~Q_2,~R_2 P1, Q1, R1, P2, Q2, R2,使用
    P 1 = − b 1 a 1 , Q 1 = − c 1 a 1 , R 1 = f 1 a 1 P 2 = − b 2 a 2 + d 2 Q 1 , Q 2 = − c 2 + d 2 P 1 a 2 + d 2 Q 1 , R 2 = f 2 − d 2 R 1 a 2 + d 2 Q 1 \begin{aligned} & P_1 = -\frac{b_1}{a_1},\quad Q_1=-\frac{c_1}{a_1},\quad R_1=\frac{f_1}{a_1} \\ & P_2 = -\frac{b_2}{a_2+d_2Q_1}, \quad Q_2 = -\frac{c_2+d_2P_1}{a_2+d_2Q_1}, \quad R_2 = \frac{f_2-d_2R_1}{a_2+d_2Q_1} \end{aligned} P1=a1b1,Q1=a1c1,R1=a1f1P2=a2+d2Q1b2,Q2=a2+d2Q1c2+d2P1,R2=a2+d2Q1f2d2R1
  2. 对于 i = 3 , 4 , 5 , . . . , N i=3,4,5,...,N i=3,4,5,...,N计算 P i ,   Q i ,   R i P_i, ~Q_i,~ R_i Pi, Qi, Ri,用
    P i = − b i a i + e i P i − 2 + ( d i + e i Q i − 2 ) Q i − 1 Q i = − c i + ( d i + e i Q i − 2 ) P i − 1 a i + e i P i − 2 + ( d i + e i Q i − 2 ) Q i − 1 R i = − f i − e i R i − 2 − ( d i + e i Q i − 2 ) R i − 1 a i + e i P i − 2 + ( d i + e i Q i − 2 ) Q i − 1 P_i=-\frac{b_i}{a_i+e_iP_{i-2}+(d_i+e_iQ_{i-2})Q_{i-1}} \\ Q_i= -\frac{c_i+(d_i+e_iQ_{i-2})P_{i-1}}{a_i+e_iP_{i-2}+(d_i+e_iQ_{i-2})Q_{i-1}} \\ R_i= -\frac{f_i-e_iR_{i-2}-(d_i+e_iQ_{i-2})R_{i-1}}{a_i+e_iP_{i-2}+(d_i+e_iQ_{i-2})Q_{i-1}} Pi=ai+eiPi2+(di+eiQi2)Qi1biQi=ai+eiPi2+(di+eiQi2)Qi1ci+(di+eiQi2)Pi1Ri=ai+eiPi2+(di+eiQi2)Qi1fieiRi2(di+eiQi2)Ri1
  3. 计算 ϕ N \phi_N ϕN ϕ N − 1 \phi_{N-1} ϕN1,用
    ϕ N = R N ϕ N − 1 = Q N − 1 ϕ N + R N − 1 \begin{aligned} & \phi_N=R_N \\ & \phi_{N-1}=Q_{N-1}\phi_N+R_{N-1} \end{aligned} ϕN=RNϕN1=QN1ϕN+RN1
  4. 对于 i = N − 2 , N − 3 , . . . , 3 , 2 , 1 i=N-2,N-3,...,3,2,1 i=N2,N3,...,3,2,1,计算 ϕ i \phi_i ϕi,用
    ϕ i = P i ϕ i + 2 + Q i ϕ i + 1 + R i \phi_i=P_i\phi_{i+2}+Q_i\phi_{i+1}+R_i ϕi=Piϕi+2+Qiϕi+1+Ri

3 迭代方法

直接解法通常并不适用于求系数疏矩阵为稀疏情况下大型的方程组,即,大多数矩阵元素是0的情况。这种情况经常会出现,比如线性化的系统方程反映的是非线性的问题(系数是依赖于解的),或是处理与时间相关的系统时。这些也正是求解流动问题时经常碰到的方程类型。

相对而言,迭代方法对于这些问题更具吸引性,因为线性化系统的解变成了迭代求解过程的一部分。而且迭代方法占用内存小、计算消耗低,这都是它比直接解法有优势的地方。

迭代方法有许多系列,对它们的详细回顾可参考相关文献书籍。本章主要介绍下基本的迭代方法,并介绍多重网格算法,其可有效克服迭代方法中的缺陷。Gauss消元和LU分解直接方法的讲解只是为了阐明数值过程中的一些基本概念,以便更加深入地理解迭代方法。

为了统一这些方法的表达形式,系数矩阵将统一写成如下形式
A = D + L + U \bold A = \bold D + \bold L + \bold U A=D+L+U
其中 D \bold D D L \bold L L U \bold U U分别是对角、严格下三角、严格上三角矩阵。即,相当于把原来系数矩阵 A \bold A A的元素剥离成对角矩阵、下三角矩阵和上三角矩阵(注意,这里的 L \bold L L U \bold U U并非是前面的LU分解出来的矩阵,而只是把原始矩阵 A \bold A A的对角线元素、下三角元素、上三角元素拿出来构成的矩阵而已)。

迭代方法在求解线性系统 A ϕ = b \bold A \boldsymbol \phi = \bold b Aϕ=b时,计算一系列的解 ϕ ( n ) \boldsymbol \phi^{(n)} ϕ(n),这些解当满足特定的条件时,收敛到精确解 ϕ \boldsymbol \phi ϕ。这样,对于特定解法而言,需要选择一个初值 ϕ ( 0 ) \boldsymbol \phi^{(0)} ϕ(0)(选择为初始条件或初始猜测值),还需要构造一个从 ϕ ( n − 1 ) \boldsymbol \phi^{(n-1)} ϕ(n1)计算到 ϕ ( n ) \boldsymbol \phi^{(n)} ϕ(n)的迭代过程。

定点迭代可通过将矩阵 A \bold A A分解为
A = M − N \bold A = \bold M - \bold N A=MN
这样,原方程 A ϕ = b \bold A \boldsymbol \phi = \bold b Aϕ=b转化为
( M − N ) ϕ = b (\bold M - \bold N)\boldsymbol \phi = \bold b (MN)ϕ=b
使用定点迭代过程,上式变为
M ϕ ( n ) = N ϕ ( n − 1 ) + b \bold M \boldsymbol \phi^{(n)} = \bold N \boldsymbol \phi^{(n-1)} + \bold b Mϕ(n)=Nϕ(n1)+b
可改写成如下形式
ϕ ( n ) = B ϕ ( n − 1 ) + C b n = 1 , 2 , . . . \boldsymbol \phi^{(n)} = \bold B \boldsymbol \phi^{(n-1)} + \bold C\bold b \quad\quad n=1,2,... ϕ(n)=Bϕ(n1)+Cbn=1,2,...
其中 B = M − 1 N \bold B=\bold M^{-1} \bold N B=M1N,而 C = M − 1 \bold C=\bold M^{-1} C=M1。这些矩阵的选择不同将产生不同的迭代方法。

在详细描述各种迭代方法之前,先讲下迭代方法需要满足什么样的一些特性,才能让其得到收敛的解。

A. 在收敛的时候,有 ϕ ( n ) = ϕ ( n − 1 ) = ϕ \boldsymbol \phi^{(n)} =\boldsymbol \phi^{(n-1)}=\boldsymbol \phi ϕ(n)=ϕ(n1)=ϕ,则迭代方程可以写成
ϕ = B ϕ + C b \boldsymbol \phi = \bold B \boldsymbol \phi + \bold C\bold b ϕ=Bϕ+Cb

C − 1 ( I − B ) ϕ = b \bold C^{-1}(\bold I - \bold B) \boldsymbol \phi = \bold b C1(IB)ϕ=b
与原方程 A ϕ = b \bold A \boldsymbol \phi = \bold b Aϕ=b相比较,可得
A = C − 1 ( I − B ) \bold A=\bold C^{-1}(\bold I - \bold B) A=C1(IB)

B + C A = I \bold B + \bold C \bold A = \bold I B+CA=I
不同矩阵间的关系保证了当达到精确解的时候,再继续迭代不会更改所得值。

B. 从 ϕ 0 ≠ ϕ \boldsymbol \phi^{0} \neq \boldsymbol \phi ϕ0=ϕ开始,该方法应保证 ϕ n \boldsymbol \phi^{n} ϕn随着迭代次数 n n n的增加最终收敛到 ϕ \boldsymbol \phi ϕ。因为 ϕ n \boldsymbol \phi^{n} ϕn可以展开成 ϕ 0 \boldsymbol \phi^{0} ϕ0的如下形式
ϕ n = B n ϕ 0 + ∑ i = 0 n − 1 B i C b \boldsymbol \phi^{n} = \bold B^n \boldsymbol \phi^{0} + \sum_{i=0}^{n-1}\bold B^i \bold C \bold b ϕn=Bnϕ0+i=0n1BiCb
那么,若要收敛成立,则需要让 B \bold B B满足(即让 ϕ 0 \boldsymbol \phi^{0} ϕ0的影响完全消失掉)
lim ⁡ n → ∞ B n = lim ⁡ n → ∞ B ∗ B ∗ B ∗ . . . ∗ B ⏟ n   t i m e s = 0 \lim_{n\rightarrow\infin}\bold B^n=\lim_{n\rightarrow\infin} \underbrace{\bold B *\bold B *\bold B*... *\bold B}_{n~times}=\bold 0 nlimBn=nlimn times BBB...B=0
这意味着 B \bold B B的谱半径要小于1,即
ρ ( B ) < 1 \rho(\bold B) < 1 ρ(B)<1
该条件保证了迭代方法是有自我纠正能力的,即,其对于精确解的任何不利的错误扰动是robust(健壮的,鲁棒的)的。

关于该条件的深层理解,可以通过定义精确值与迭代值之间的错误矢量 e ( n ) \bold e^{(n)} e(n),即
e ( n ) = ϕ ( n ) − ϕ e ( n − 1 ) = ϕ ( n − 1 ) − ϕ \bold e^{(n)}=\boldsymbol \phi^{(n)}-\boldsymbol \phi \\ \bold e^{(n-1)}=\boldsymbol \phi^{(n-1)}-\boldsymbol \phi e(n)=ϕ(n)ϕe(n1)=ϕ(n1)ϕ
ϕ = B ϕ + C b \boldsymbol \phi = \bold B \boldsymbol \phi + \bold C\bold b ϕ=Bϕ+Cb ϕ ( n ) = B ϕ ( n − 1 ) + C b \boldsymbol \phi^{(n)} = \bold B \boldsymbol \phi^{(n-1)} + \bold C\bold b ϕ(n)=Bϕ(n1)+Cb两式子互减,可得
e ( n ) = B e ( n − 1 ) \bold e^{(n)} = \bold B \bold e^{(n-1)} e(n)=Be(n1)
因此,若方法是收敛的,则应满足如下式子
lim ⁡ n → ∞ e ( n ) = 0 \lim_{n\rightarrow\infin}\bold e^{(n)}=0 nlime(n)=0
为使上式更有意义,假设 B \bold B B的特征向量是完全的,且形成一个完备集,即它们是 R N \bold R^N RN的基本集。那么 e \bold e e可以用 B \bold B B N N N个特征向量 v \bold v v的线性组合表示,即
e = ∑ i = 1 N α i v i \bold e=\sum_{i=1}^{N}\alpha_i \bold v_i e=i=1Nαivi
每个特征向量满足
B v i = λ i v i \bold B \bold v_i = \lambda_i \bold v_i Bvi=λivi
其中 λ i \lambda_i λi是与特征向量 v i \bold v_i vi相关的特征值,根据 e ( n ) = B e ( n − 1 ) \bold e^{(n)} = \bold B \bold e^{(n-1)} e(n)=Be(n1),从第1个迭代步开始,有
e ( 1 ) = B e ( 0 ) = B ∑ i = 1 N α i v i = ∑ i = 1 N α i ( B v i ) = ∑ i = 1 N α i ( λ i v i ) \bold e^{(1)} = \bold B \bold e^{(0)} = \bold B \sum_{i=1}^{N}\alpha_i \bold v_i = \sum_{i=1}^{N}\alpha_i (\bold B\bold v_i) = \sum_{i=1}^{N}\alpha_i (\lambda_i \bold v_i) e(1)=Be(0)=Bi=1Nαivi=i=1Nαi(Bvi)=i=1Nαi(λivi)
对于第2次迭代,误差变为
e ( 2 ) = B e ( 1 ) = B ∑ i = 1 N α i ( λ i v i ) = ∑ i = 1 N α i λ i ( B v i ) = ∑ i = 1 N α i λ i 2 v i \bold e^{(2)} = \bold B \bold e^{(1)} = \bold B \sum_{i=1}^{N}\alpha_i (\lambda_i \bold v_i) = \sum_{i=1}^{N}\alpha_i \lambda_i (\bold B \bold v_i) = \sum_{i=1}^{N}\alpha_i \lambda_i^2 \bold v_i e(2)=Be(1)=Bi=1Nαi(λivi)=i=1Nαiλi(Bvi)=i=1Nαiλi2vi
该过程可重复执行,有
e ( n ) = ∑ i = 1 N α i λ i n v i \bold e^{(n)} = \sum_{i=1}^{N}\alpha_i \lambda_i^n \bold v_i e(n)=i=1Nαiλinvi
因此,如果随着 n n n趋近无穷大迭代过程要趋于收敛的话,那么所有的特征值必须小于1。如果特征值之中有任何大于1的,那么误差将趋于无穷大。这就很好地解释了为啥谱半径要小于1,因为谱半径实际上是最大特征值,即
ρ ( B ) = max ⁡ i = 1 N ( λ i ) < 1 \rho(\bold B) = \max_{i=1}^{N}(\lambda_i) < 1 ρ(B)=i=1maxN(λi)<1
通过减小迭代矩阵的谱半径,也可以提高迭代方法的收敛速度,这也是迭代技术的核心。

C. 迭代方法中需要给出停止判据,应用较多的准则是给予残差的幅值变化,残差如下
r ( n ) = A ϕ ( n ) − b \bold r^{(n)} = \bold A \boldsymbol \phi^{(n)} - \bold b r(n)=Aϕ(n)b
一个准则是找寻区域中的最大残差,让其值小于某个阈值 ϵ \epsilon ϵ定义为收敛条件,即
max ⁡ i = 1 N ∣ b i − ∑ j = 1 N a i j ϕ j ( n ) ∣ ≤ ϵ \max_{i=1}^N \left| b_i - \sum_{j=1}^N a_{ij} \phi_j^{(n)} \right| \le \epsilon i=1maxNbij=1Naijϕj(n)ϵ
或者root mean square残差(RMS均方根残差)小于 ϵ \epsilon ϵ,即
∑ i = 1 N ( b i − ∑ j = 1 N a i j ϕ j ( n ) ) 2 N ≤ ϵ \frac{\displaystyle \sum_{i=1}^{N}\left( b_i - \sum_{j=1}^N a_{ij}\phi_j^{(n)} \right)^2}{N} \le \epsilon Ni=1N(bij=1Naijϕj(n))2ϵ
还有一种准则是让两个连续迭代过程中的最大单位化差值小于 ϵ \epsilon ϵ,即
max ⁡ i = 1 N ∣ ϕ i ( n ) − ϕ i ( n − 1 ) ϕ i ( n ) ∣ × 100 ≤ ϵ \max_{i=1}^{N}\left| \frac{\phi_i^{(n)}-\phi_i^{(n-1)}}{\phi_i^{(n)}} \right| \times 100 \le \epsilon i=1maxNϕi(n)ϕ

你可能感兴趣的:(FVM,in,CFD,学习笔记)