我正在使用 Eigen(一个用于数值线性代数的 C++ 库)来使用具有不完整 LU 预条件器的双共轭梯度 BICGSTAB 算法求解线性方程。但是,结果在 1 次迭代后bg.error()("estimated error")变为。-1.#IND线性系统的大小为。谁能帮我解决这个问题?我还尝试了较小的系统,例如,效果很好。
为什么在 eigen 中使用 ILUT perconditioner 执行 BICGSTAB 线性求解器时会出现“估计错误”-1.#IND
计算科学
线性求解器
数字
本征
2021-12-13 19:08:42
1个回答
这是一个古老的问题,它不包含足够的信息来肯定地回答它。但由于我已经偶然发现过一次,我想提出一份行动清单,应该能够帮助解决所有不确定性问题。
- 首先要做的是检查原始矩阵本身是否包含有效条目。
hasNaN()和allFinite()方法会有所帮助。 - Incomplete LU preconditioner 提供了一个
info()函数,如果 ILU 的计算成功,它将回答这个问题。 - 可以尝试使用 ILU 参数,例如容差和填充因子
setDropTol(),setFillfactor()并查看它是否会产生不同的info()结果或有助于迭代求解过程。 - 也不清楚 Eigen 是否与某些 BLAS/LAPACK 库(例如 Intel MKL)和/或稀疏求解器(例如 SuperLU)相关联。打开/关闭这些选项当然可以帮助确定问题的根源。如果 1-3 没问题,最干净的运行,其中 Eigen 与可靠的 BLAS/LAPACK 链接而没有任何额外的库应该是成功的。
接下来,不清楚要解决的系统是稀疏的还是密集的。如果原始矩阵很密集,则可能存在内存问题。对于,密集矩阵和预处理器将只占用几兆字节;但是,在密集矩阵的情况下,,预条件子中的大填充和容差,肯定会超出内存,例如,在尝试“反转” ILU 时。
- 检查内存使用情况和问题的要求。
如果发生了非常奇怪的事情,了解我们正在尝试解决什么样的野兽是非常有趣的。然后:
- 绘制矩阵的奇异值
- 计算条件数
相同的调试算法通常应该适用于预处理器参数略有变化的其他类似问题。
其它你可能感兴趣的问题