2014-12-03 49 views
1

我使用Eigen的稀疏矩陣功能在C++中使用正方形100x100域的有限差分(在所有面上都使用neumann bcs),並內置解算器來計算Ax = b中的x。本徵共軛梯度與Poisson方程的SimplicialLLT

我已經嘗試了下面的求解器,但是我得到的結果非常不同,我期望通過閱讀http://eigen.tuxfamily.org/dox-devel/group__TopicSparseSystems.html中的文檔,它給出了不同求解器的典型時間尺度。具體來說,文檔建議共軛梯度應該是解決這個系統的最快方法之一,給解決Poisson SPD的時間尺度爲0.239秒,其尺寸大於我的系統。相比之下,這個文檔表明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是字段的點源的向量。

謝謝!

回答

3

在此文檔,Poisson_SPD對應於一個三維的問題,因爲有更多的填充在因素是直接的方法爲喬萊斯基更難。正如第一張表格中的相同文檔頁面所述,對於您的2D Laplacian /泊松問題,建議使用SimplicialLLT

+0

非常感謝,非常感謝。 – ben18785 2014-12-03 14:50:05