Krylov子空间法 — CAE术语解释
Krylov子空间法
老师,Krylov子空间法是反复求解器的核心技术吧?
Krylov子空间法的理论基础
Krylov子空间法的基本概念
Krylov子空间法,这个名字我经常听到,但实际上是在做什么呢?"子空间"这个概念也不太好理解。
这是求解线性方程组
"最优"的标准是什么呢?是最小化残差的范数吗?
完全正确。代表性的算法CG法(共轭梯度法)最小化能量范数
为什么不用直接法一步解决,非要用迭代法呢?有限元分析产生的大矩阵难道直接法也解决不了吗?
计算成本和内存使用量完全不同。以自由度100万的三维结构分析为例。直接法(如稀疏LU分解)会产生大量"填充"现象,非零元素数量急剧增加,内存需求可达数百GB乃至TB级别,计算时间也会非常长。而使用适当预处理的Krylov法,只需保存矩阵A本身,每次迭代主要进行矩阵向量乘法运算,内存用量通常只需数GB,计算速度往往更快。
Krylov子空间法的数值计算方法
主要算法及其应用
除了CG法和GMRES法,我还听说过Bi-CGSTAB和MINRES。这些都是Krylov子空间法的一种吗?要怎样区分使用呢?
是的,这些都属于Krylov子空间法家族。第一选择基准是矩阵的性质。
您刚才说GMRES法的内存会增加,具体是什么机制,怎样应对呢?
GMRES用Arnoldi过程构造正交基向量,需要保存所有这些基向量。随着迭代次数m增加,要保存m个n维向量,内存用量按O(mn)增长。对策是"重启"。例如在第50次迭代时,取得到的近似解作为新初值,重新开始构造Krylov子空间(记为GMRES(50))。但重启的代价是失去最优性保证(残差最小性不再保证)。
收敛判定中的"残差范数"具体看哪个值呢?我一直都是凭感觉设成"1e-6"这样的值。
通常用相对残差范数
Krylov子空间法的实际应用
预处理的重要性与选择
用Krylov法时总是需要"预处理"。不加预处理会怎样?ILU和IC有什么区别?
不用预处理的Krylov法在实际问题中基本上收敛不了或极其缓慢。预处理矩阵
Fill-in等级具体怎么决定呢?先从0开始试就行吗?
取决于问题的难度。简单的线性弹性问题用IC(0)或ILU(0)就足够了。但当网格纵横比极端(1:1000以上)或材料特性差异大(橡胶与钢接触)等"条件数很差"的情况,ILU(0)可能无法收敛或收敛太慢。此时改用ILU(1)或ILU(阈值=0.01)时,迭代次数可能下降十倍以上。实用做法是:先试0,不行再升级。
在软件设置里还看到过"V循环"和"AMG"这样的预处理名字。它们与ILU有什么区别?
这些是基于"代数多重网格法(AMG)"的预处理。与ILU的"局部"近似分解不同,AMG从"全局"尺度消除误差,特别是在结构力学非标准问题(如几乎不可压缩材料)中很有效。Ansys Mechanical中,用AMG预处理的CG法已成为替代稀疏直接求解器的默认反复求解器。大规模模型的计算中,它在内存和时间上都优于直接法。
Krylov子空间法的软件比较
各CAE软件中的实现与默认设置
Ansys、Abaqus、COMSOL这些主流软件中,Krylov法是怎样实现的?用户能调整多少?
各公司都采用高度优化的求解器库(PETSc、Trilinos、自研),但开放程度因软件而异。
CFD软件的情况不同吗?OpenFOAM这样的开源软件怎样呢?
差别很大。CFD中主要是非对称矩阵,GMRES和Bi-CGSTAB是主力。
Krylov子空间法的故障排除
收敛缓慢或不收敛的对策
反复求解器有时完全收敛不了,或报"收敛失败"错误。最先要检查什么?
按以下顺序检查。
模型和网格都没问题,但还是收敛慢。应该改预处理吗?
是的。先试提高预处理的"强度"。比如从ILU(0)改成ILU(1)或ILUT,放松Fill-in容限或阈值。Ansys的AMG预处理可将"松弛类型"从"高斯-赛德尔"改成更强的"SOR"或"切比雪夫多项式"。但预处理本身的计算和内存成本会增加,需要权衡。
求解器有时报"NaN(非数)"或"无穷"。这是Krylov法特有的问题吗?
反复法比直接法更容易出现。主要原因两个。
反复求解器和直接法的结果有时细微不同。这是可以接受的误差吗?
若收敛容限足够严格(如1e-8以下),差异可忽略。但宽松的容限(1e-4)会在对灵敏度高的量(应力集中部的最大应力、流体阻力系数)上产生数%的差异。关键是验证关心的物理量是否对收敛容限"已收敛"。逐步严格化容限(1e-4、1e-5、1e-6),找到结果不再变化的点,那才是可信的。这就像"网格独立性检验"一样,是"求解器收敛性检验"。
相关主题
价值
更详细
错误