我使用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是场的点源矢量。
谢谢!
本
答案 0 :(得分:3)
在这个文档中,Poisson_SPD对应于一个3D问题,这对于Cholesky的直接方法来说要困难得多,因为因素中有更多的填充。正如第一个表中所述的文档页面所示,对于您的2D拉普拉斯/泊松问题,SimplicialLLT
是推荐的求解器。