为什么牛顿法不能收敛?


22

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


8
与任何迭代方法一样,最重要的是要拿出一个好的种子来启动Newton-Raphson方法。起点差通常会导致混乱。
JM

6
我认为“经常导致混乱”是不正确的。关于Blum,Cucker,Shub和Smale,Newton具有被边界分隔的有吸引力的盆地,这可能导致混沌迭代。因此,与收敛相比,这种行为是非常不可能的。如果该算法仅在寻找真实的解决方案,它将不会经常收敛,但不会变得混乱。
Matt Knepley 2011年

5
我的意思是非技术意义上的“混乱”,@ Matt;例如,发散到无穷大或循环行为。也许“灾难”本来是更好的选择?
JM

Answers:


42

牛顿法可能由于许多原因而无法收敛,这是一些最常见的方法。

  • 雅可比行法是错误的(或顺序正确,但不是并行正确)。
  • 线性系统没有求解或没有足够精确地求解。
  • 雅可比系统具有线性求解器未处理的奇点。
  • 函数评估例程中有一个错误。
  • 该函数不连续或没有连续的一阶导数(例如,相变或TVD限制器)。
  • 这些方程式可能没有解(例如,极限循环而不是稳态),或者初始猜测和稳态之间可能存在“爬坡”(例如,反应物必须先点燃并燃烧才能达到稳态,但稳态-状态残留在燃烧过程中会更大)。

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

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

如果上述所有内容都通过了检查,以下是一些有助于牛顿过程的方法

  • 使用网格排序(-snes_grid_sequence如果需要使用,就可以完成所有工作DM),以便在更细的网格上生成更好的初始猜测
  • 以四精度运行(./configure --with-precision=__float128 --download-f2cblaslapack使用PETSc 3.2和更高版本,需要版本4.6或更高版本的GNU编译器)
  • 更改单位(无量纲化),边界条件缩放或公式化,以使Jacobian条件更好。
  • 缩小功能中不具有连续一阶导数的特征(通常if在残差评估中存在某些陈述时发生,例如相变或TVD限制器)。如果不连续至关重要,请使用变分不等式求解器(SNESVINEWTONRSLS)。
  • 尝试使用信任区域方法(-ts_type tr,可能必须调整参数)。
  • 从了解解决方案的角度出发,使用一些连续参数运行,请参阅TSPSEUDO以解决稳态问题。有诸如PHCpack之类的同伦解算器软件包可以为您提供所有可能的解决方案(并告诉您已经找到了所有解决方案),但这些软件包不可扩展,只能解决小问题。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.