为什么牛顿的方法不收敛?

计算科学 宠物 pde 隐式方法
2021-12-12 21:13:00

我正在使用PETSc的非线性求解器包SNES来求解通过离散偏微分方程获得的非线性方程组。如何确定求解器未收敛的原因以及如何成功求解方程?

1个回答

牛顿法可能由于多种原因不能收敛,这里有一些最常见的。

  • 雅可比是错误的(或顺序正确但不平行)。
  • 线性系统未解或解得不够准确。
  • Jacobian 系统具有线性求解器无法处理的奇异性。
  • 函数评估例程中存在错误。
  • 该函数不连续或没有连续的一阶导数(例如相变或 TVD 限制器)。
  • 方程可能没有解(例如极限环而不是稳态),或者在初始猜测和稳态之间可能存在“山丘”(例如反应物必须在达到稳态之前点燃和燃烧,但稳态-燃烧时状态残差较大)。

以下是一些帮助调试牛顿收敛不足的方法。

  • 使用选项运行-snes_monitor -ksp_monitor_true_residual -snes_converged_reason -ksp_converged_reason如果线性求解不收敛,检查雅可比是否正确,然后看这个问题如果预条件残差收敛,但真实残差不收敛,则预条件子可能是奇异的。如果线性求解收敛良好,但线搜索失败,则雅可比可能不正确。
  • 运行 with-pc_type lu or -pc_type svd以查看问题是否是较差的线性求解器
  • 运行-mat_viewor-mat_view_draw看看 Jacobian 看起来是否合理
  • 运行-snes_type test -snes_test_display以查看您使用的雅可比是否错误。添加时比较输出-mat_fd_type ds以查看结果是否对差分参数的选择敏感。
  • 运行-snes_mf_operator -pc_type lu以查看您使用的雅可比是否错误。如果问题太大而无法直接解决,请尝试-snes_mf_operator -pc_type ksp -ksp_ksp_rtol 1e-12. 添加时比较输出-mat_mffd_type ds以查看结果是否对差分参数的选择敏感。
  • 在一个处理器上运行,看看问题是否只是并行。
  • 运行 with-snes_ls_monitor以查看线搜索是否失败(这通常是雅可比差的标志)。
  • 运行-info以获取有关解决方案过程的更多详细信息。

如果上面的所有内容都检查出来,这里有一些方法可以帮助牛顿过程

  • 使用网格排序运行(-snes_grid_sequence如果使用 a ,您只需要DM)以在更精细的网格上生成更好的初始猜测
  • 以四精度运行(./configure --with-precision=__float128 --download-f2cblaslapack使用 PETSc 3.2 及更高版本,需要 4.6 或更高版本的 GNU 编译器)
  • 更改单位(无量纲化)、边界条件缩放或公式,以便更好地调节雅可比。
  • 平滑函数中不具有连续一阶导数的特征(通常if在残差评估中有语句时发生,例如相变或 TVD 限制器)。如果不连续性具有根本重要性,请使用变分不等式求解器 ( SNESVINEWTONRSLS )。
  • 尝试信任区域方法(-ts_type tr可能需要调整参数)。
  • 从您知道解决方案的点开始使用一些延续参数运行,请参阅TSPSEUDO以解决稳态问题。有像 PHCpack 这样的同伦求解器包可以为您提供所有可能的解决方案(并告诉您它已经找到了所有解决方案),但这些解决方案不可扩展,只能解决小问题。