我使用 Eigen 的稀疏矩阵功能在 c++ 中对一个 100x100 的正方形域(所有边都有 neumann bcs)使用有限差分,并内置求解器来计算 Ax=b 中的 x。
我已经尝试了以下求解器,但是从阅读http://eigen.tuxfamily.org/dox-devel/group__TopicSparseSystems.html中的文档获得的时间结果与我所期望的完全不同,该文档为不同的求解器提供了典型的时间尺度。特别是,文档表明共轭梯度应该是解决这个系统的最快方法之一,它给出了 0.239 秒的时间尺度来解决比我的系统更大的 Poisson SPD。相比之下,该文档建议 SimplicialLLT 大约需要 3 倍的时间。
当我运行每个求解器时,我得到以下结果: - 共轭梯度:25 秒 - LLT:0.35 秒
我想知道是否有人可以帮助我理解为什么这两个求解器之间存在两个数量级,尤其是与文献相比,为什么 CG 似乎被 LLT 击败了?此外,如果其他人知道我如何通过使用与其他软件包不同的方法来显着加快求解器的速度,那么欢迎提出建议!
我正在通过以下方式实现求解器:
//Conjugate gradients
ConjugateGradient<SparseMatrix<double> > cg;
cg.compute(A);
MatrixXd vGDNF = cg.solve(b);
//SimplicialLLT
SimplicialLLT<SparseMatrix<double>> solver;
MatrixXd vGDNF = solver.compute(A).solve(b);
这里A是有限差分拉普拉斯算子,b是场的点源向量。
谢谢!
本