我需要对多重网格方法或一些相关文献的简单解释。
我熟悉迭代方法,包括 BiCGStab、CG、GS、Jacobi 和预处理,但我是 multigrid 方法的初学者。
有人可以详细解释这一点,或者至少提供清楚的伪代码或源代码,即使对于非常初学者来说也有很好的文献?谢谢!
我需要对多重网格方法或一些相关文献的简单解释。
我熟悉迭代方法,包括 BiCGStab、CG、GS、Jacobi 和预处理,但我是 multigrid 方法的初学者。
有人可以详细解释这一点,或者至少提供清楚的伪代码或源代码,即使对于非常初学者来说也有很好的文献?谢谢!
多重网格背后的主要思想是投影。我试着这样想:
假设我想以很高的精度求解 PDE,因此我继续在具有很多很多点的非常精细的网格上离散域(比如说,使用有限差分法)。最后,我设置了我的方程组,并准备解决它。我尝试使用我最喜欢的迭代求解器(jacobi、gauss seidel、共轭梯度等)。我继续等待超过一天,并意识到我的计算机仍在尝试计算答案!!!
这些迭代方法不能快速工作的原因是(通常)当您设置这样的大型方程组时,矩阵本身的特征值非常接近 1。为什么这很重要?因为许多迭代方法的收敛速度与最大特征值成反比(请参阅 Christian Clason 到 Brigg 的多重网格教程幻灯片的链接,第 1 部分,第 27 页)。因此,最大特征值越接近 1,迭代方法越慢。(注意:这有点过于简单化了,但它有助于激发对多重网格的需求)。
显然,如果未知数较少(即在网格点较少的粗网格上),解决问题总是更快。但更重要的是,较粗网格上的解(或近似解)是解决较细网格上问题的良好起点。 这是大多数(如果不是全部)多重网格方法背后的关键思想。为什么会这样?直观地说,这是有道理的,但有一种数学上严谨的方法可以证明这一点。
让我们看一下应用于原始细网格问题的迭代方法(为了论证,假设为 jacobi 或 gauss seidel)中误差的傅立叶模式。我们会看到,在最初的几次迭代中,大部分高频(高度振荡)错误都被消除了!这很好,但是仍然存在低频(较少振荡)误差并且不会很快消失。事实上,正是低频误差阻止了标准迭代方法快速收敛。
当我们在较粗的网格上解决问题时(比如说,通过像 jacobi 或 gauss-seidel 这样的迭代方法),我们基本上能够比在细网格上更快地(即在更少的迭代中)消除低频误差。因此,如果我们解决粗网格问题,我们的解决方案的低频误差已显着减少。因此,它可以作为更精细网格上的迭代方法的起点。
虽然有不同的多重网格方法,但它们中的大多数都通过以下一些变化进行操作:
对我来说,多重网格方法最困难的部分是网格之间的投影。@ChristianClason 建议的 Briggs 教程比我能更好地处理这个主题。
这个网站可能不是一个用伪代码要求详细解释的好地方(如常见问题解答中所述,“如果你能想象一整本书可以回答你的问题,那么你问的太多了。”),所以你可能想要从有关该主题的经典书籍之一(如下所列)开始,然后返回有关您遇到麻烦的具体细节的具体问题。
Briggs, Multigrid Tutorial , SIAM, 2000 (您可以在此处和此处下载幻灯片)这是一个随意的来源,对多重网格原理进行了温和的介绍,主要针对椭圆问题。
Brandt,Multigrid Techniques,修订版,SIAM 2011,(或下载pdf)。这是多重网格哲学和多尺度建模的重大发展,很有可能深刻改变您对隐式求解器的思考方式。 Achi Brandt 的网站包含更多参考资料,包括他的2000 Review of Multiscale Scientific Computation。
Trottenberg, Oosterlee 和 Schueller, Multigrid , Academic Press, 2001这比 Brandt 有更多的工作示例,包括许多关于特定方法的实验和细节,特别是在流体动力学的背景下。
Hackbusch, Multigrid Methods and Applications , Springer, 1985 这提供了严格的收敛理论,包括 Fredholm 积分算子的“第二类多重网格”。