求解非线性方程组时,残值变为 NaN

计算科学 非线性方程 牛顿法
2021-12-25 06:38:39

我正在使用牛顿法求解耦合非线性方程组,类似于 with非线性函数,取决于

cA(A,B)tA=(kA(A,B)A)+fA(A,B,t)cB(A,B)tB=(kB(A,B)B)+fB(A,B,t)
fx(),kx() and cx()AB

为了计算雅可比矩阵,我使用了 AD 工具(Sacado/ADOL-C)。
当一次只计算一个方程(并将另一个方程设置为常数值)时,程序运行良好。当同时计算两个方程时,求解器迟早会在迭代 0(GMRES 求解器)中失败,“残差等于NaN”。为例) ,也会发生这种情况B

cB(A,B)tB=0

调试此问题的最佳方法是什么?我认为它与竞争条件无关,因为无论使用多少线程,它总是同时出现。

我正在测试的一个想法是使用 AD 为第一个方程生成雅可比,并手动添加第二个方程的雅可比。
这种行为还有其他原因吗?

1个回答

其他几个可能的线索:

  • 检查您的 RHS(大小、NaNs 或infs 的存在)以了解同时求解方程的情况。在这方面有可能出现问题。
  • 在调试模式下编译您的代码并使用 1 个线程运行一个小示例,看看它是如何进行的。
  • Valgrind检测对未分配内存的潜在访问(以及内存泄漏),以查看潜在问题主要在您身边(除非您可以通过 valgrind 外部库来精神上强大)
  • 另一个高级选项是尝试查看这些NaNs 首先出现在哪个步骤。看看这篇描述使用调试器在 C 和 C++ 中使用 gcc/gdb捕获NaNs以及经典运行时信号NaNs 的帖子。