为什么牛顿的方法不收敛?
计算科学
宠物
pde
隐式方法
2021-12-12 21:13:00
1个回答
牛顿法可能由于多种原因不能收敛,这里有一些最常见的。
- 雅可比是错误的(或顺序正确但不平行)。
- 线性系统未解或解得不够准确。
- Jacobian 系统具有线性求解器无法处理的奇异性。
- 函数评估例程中存在错误。
- 该函数不连续或没有连续的一阶导数(例如相变或 TVD 限制器)。
- 方程可能没有解(例如极限环而不是稳态),或者在初始猜测和稳态之间可能存在“山丘”(例如反应物必须在达到稳态之前点燃和燃烧,但稳态-燃烧时状态残差较大)。
以下是一些帮助调试牛顿收敛不足的方法。
- 使用选项运行
-snes_monitor -ksp_monitor_true_residual -snes_converged_reason -ksp_converged_reason
。如果线性求解不收敛,检查雅可比是否正确,然后看这个问题。如果预条件残差收敛,但真实残差不收敛,则预条件子可能是奇异的。如果线性求解收敛良好,但线搜索失败,则雅可比可能不正确。 - 运行 with
-pc_type lu or -pc_type svd
以查看问题是否是较差的线性求解器 - 运行
-mat_view
or-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 这样的同伦求解器包可以为您提供所有可能的解决方案(并告诉您它已经找到了所有解决方案),但这些解决方案不可扩展,只能解决小问题。
其它你可能感兴趣的问题