2014-12-03 4 views
1

나는 Eigen의 희소 행렬 기능을 사용하는 C++의 정사각형 100x100 도메인 (모든면에 neumann bcs 포함)에 유한 차분을 사용하고 Ax = b에서 x를 계산하는 솔버로 작성했습니다.Eigen의 공액 기울기 대 Poplon 방정식의 SimplicialLLT 방정식

다음 솔버를 시도했지만 다른 솔버의 일반적인 시간 계를 제공하는 http://eigen.tuxfamily.org/dox-devel/group__TopicSparseSystems.html의 설명서를 읽는 것으로 예상되는 결과가 매우 다른 시간대로 바뀌고 있습니다. 특히, 공액 그라디언트는이 시스템을 푸는 가장 빠른 방법 중 하나 여야하며, 시스템보다 큰 크기의 푸 아송 SPD를 풀 때 0.239 초의 시간을 주어야합니다. 대조적으로이 문서는 SimplicialLLT가 대략 3X 정도 걸릴 것이라고 제안합니다.

나는 다음 획득하고있는 해법의 각 실행하면 : - 어원이 그라디언트 25 초 - LLT : 0.35 초

을 나는 2 차의 크기가 왜 사람이 나를 이해하는 데 도움이 수 있는지 궁금

이 두 솔버 사이에서, 특히 문학과는 대조적으로 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/Poisson 문제가있는 경우 SimplicialLLT이 권장되는 해결 방법입니다.

+0

감사합니다. 대단히 감사합니다. – ben18785