Multigrid Method
多重网格简单示例
基本理论
考虑这样的线性方程组 $$ \mathbf{A}\vec{x} = \vec{b} $$ 当使用标准迭代求解器(Gauss-Seidel,Jacobi,SOR)时,观察到收敛速度趋于“停顿”,即在几次迭代后无法有效减少误差,细化网格后,问题更加突出。 实际上,研究表明,收敛速度是误差场频率的函数,即误差从节点到节点的梯度。 如果误差以高频模式分布,则收敛速度很快。 然而,在最初的几次迭代之后,误差场被平滑(变为低频),使得收敛速度变差。
一个显而易见的想法是:既然平滑后的误差在细网格上变为了低频,那么这个误差可以在粗网格上得到有效消除,因为细网格上的低频可能是粗网格上的高频!
迭代得到的中间值设为$\vec{y}$,则 $$ \mathbf{A}\vec{y} = \vec{b} - \vec{r} $$ $\vec{r}$为残差向量,如果用$\vec{e} = \vec{x} - \vec{y}$表示中间值和解之间的距离,则 $$ \mathbf{A}\vec{e} = \vec{r} $$ 因此这个方程与原来要解的方程具有同样的系数矩阵,如果可以解出$\vec{e}$,那么便可修正中间值。为了有效地达成这一目的,把上面的方程放到粗网格中计算,以快速光滑残差。在这之后,将$\vec{e}$再投影回细网格来修正解,如此反复迭代。
多重网格方法常用的几个名词:
Agglomeration
:所有的多重网格方法都需要在原始“精细”网格的基础上定义一系列粗网格。定义粗网格的过程涉及到所谓的聚集,即从原始网格中组合几个节点或控制量或系数,得到粗网格上的稀疏矩阵。Restriction
:利用插值方法将误差向量投影到粗网格上Prolongation
:Restriction的反过程
多重网格法的两种形式:
- Geometric multigrid:在几何多重网格中,生成了网格的层次结构。方程在每个级别上进行离散。 几何多重网格优于代数多重网格的优点是,对于非线性问题,前者应具有更好的性能,因为系统中的非线性通过重新离散化可以降低到粗糙的水平。
- Algebraic multigrid:该算法被称为代数多重网格方案,因为生成的粗糙层方程没有使用任何几何或在粗糙层上的重新离散。这样做的优点是不需要生成或存储粗级别的网格,也不需要在粗级别上计算通量或源项。这一特性使得AMG对于非结构化网格的使用尤为重要。
多重网格法的关键算子:
-
Prolongation算子$\mathbf{P}$,将粗网格上的结果插值到细网格上
-
Restriction算子 $\mathbf{R}$,$\mathbf{R} = \frac{1}{2}\mathbf{P^T}$
-
代数多重网格的粗网格矩阵:$\mathbf{A_{2h}} = \mathbf{R}\mathbf{A_h}\mathbf{P}$
算例
一个带内热源的导热问题 $$ k\frac{d^2T}{dx^2} + g = 0 $$ 长度1m,截面积0.01$m^2$,$k = 5 W/m.K$,$q = 20 kW/m^3$
离散过程很简单,最后得到一个三对角矩阵,可以使用TDMA直接求解,在这里将使用多重网格进行求解。
- V型循环,三层网格,网格数依次为20、10、5
- 最后一层使用TDMA直接求解
- $\mathbf{P}$和$\mathbf{R}$都使用线性插值代替
- 粗网格矩阵可以重新离散得到或者使用插值
|
|
|
|
设定迭代判据为平均残差(绝对值)小于$1\times 10^{-6}$时收敛,经过27次V循环,迭代收敛。
分析
可以看到,单纯的高斯赛德尔迭代需要近660步才能迭代到收敛,而采用多重网格后,只需要27个V循环,每个循环由2次细网格上的GS迭代和10次较粗网格上的GS迭代以及最粗网格的TDMA组成,大大减少了计算量。
参考
-
[1] MIT courseware
-
[2] H.K.Versteeg, An introduction to computational fluid dynamics: the finite volume method