我正在寻找一个用于求解大型非线性方程组的库,类似于MINPACK ,但与 MINPACK 不同,它可以在band-storage中接受雅可比行列式。
我的雅可比矩阵有时是不可逆的,因此像MINPACK 中的Levenberg-Marquardt 算法这样可以处理奇异雅可比矩阵的方法很重要。此外,如果包在 Fortran 中会很好,但 C/C++ 也可以。
我正在求解一个由约 10,000 个非线性方程组成的系统,其非零对角线约 200 宽,因此需要使用频带存储。感谢您的任何建议。
我正在寻找一个用于求解大型非线性方程组的库,类似于MINPACK ,但与 MINPACK 不同,它可以在band-storage中接受雅可比行列式。
我的雅可比矩阵有时是不可逆的,因此像MINPACK 中的Levenberg-Marquardt 算法这样可以处理奇异雅可比矩阵的方法很重要。此外,如果包在 Fortran 中会很好,但 C/C++ 也可以。
我正在求解一个由约 10,000 个非线性方程组成的系统,其非零对角线约 200 宽,因此需要使用频带存储。感谢您的任何建议。
有几个选项
或者,您可以尝试使用非线性最小化器,例如Google的Ceres求解器。这个库支持稀疏雅可比矩阵,但他们的 Levenberg-Marquardt 实现主要针对非线性最小二乘问题。Stack Overflow 上的一个答案解释了您如何仍然可以使用它,但它涉及收敛到最小而不是根的风险。
除了 KINSOL,这些代码似乎都没有特别适用于带状矩阵。一般来说,如果您将 Jacobian 矩阵存储为稀疏矩阵(例如 CSR 格式),粗略计算表明您应该能够将内存消耗从 ~100 MB 减少到 ~2 MB(假设您使用的是 64-位实数)。与一般的稀疏数组相比,LAPACK 带状存储不需要整数指针数组,因此您可以节省一些额外的费用 (~1 MB)。在这两种情况下,我认为您都可以期望看到显着的性能提升。