2016-11-12 3 views
1

J'essaie de résoudre un très grand système d'équations linéaires en C++. Actuellement, j'utilise BiCGSTAB de eigen. Cela fonctionne bien pour une petite matrice, mais cela prend juste trop de temps pour la matrice de la taille dont j'ai besoin, qui est 40804x40804 (elle pourrait être encore plus grande dans le futur).C++ Comment résoudre un très grand système de système linéaire épars?

J'ai un script très long, mais je simplement utilisé le format suivant:

SparseMatrix<double> sj(40804,40804); 
VectorXd c_(40804), sf(40804); 
sj.reserve(VectorXi::Constant(40804,36)); //This is a very good estimate of how many non zeros in each column 
//...Fill in actual number in sj 
sj.makeCompressed(); 
BiCGSTAB<SparseMatrix<double> > handler; 
//...Fill in sj, only in the entries that have been initialized previously 
handler.analyzePattern(sj) 
handler.factorize(sj); 
c_.setZero(); 
c_=handler.solve(sf); 

Cela prend trop de temps! Et oui, la solution existe. La fonction Sparse de matlab semble très bien gérer cela, mais j'en ai besoin en C++ pour me connecter à un serveur.

J'apprécierais vraiment que vous puissiez m'aider!

+0

Si Matlab faire du bon travail pour vous, pourquoi ne pas l'utiliser en C++. [Lien] (https://www.mathworks.com/help/matlab/matlab_external/calling-matlab-software-from-ac-application.html) – Logman

+0

Si la connexion à un serveur est cruciale, vous devriez peut-être essayer plutôt pari/gp ... – jaroslawj

+0

Assurez-vous de compiler avec les optimisations du compilateur ON, vous pouvez aussi essayer un solveur direct comme 'Eigen :: SparseLU' (remplacez simplement' BiCGSTAB' par 'SparseLU') ou en utilisant le préconditionneur' IncompleteLUT' dans BICGSTAB. – ggael

Répondre

1

Vous devriez envisager d'utiliser l'une des rares avancées solveurs directs: CHOLMOD

Sparse solveurs directs sont un outil fondamental dans l'analyse informatique, en fournissant une méthode très générale pour obtenir des résultats de haute qualité pour presque tous les problèmes. CHOLMOD est une bibliothèque haute performance pour Cholesky factorization clairsemée.

Je garantis que ce paquet va certainement vous aider. En outre CHOLMOD a soutenu GPU accélération depuis 2012 avec la version 4.0.0. Dans SuiteSparse-4.3.1, les performances ont été encore améliorées, en fournissant des accélérations de 3x ou plus par rapport au CPU pour l'opération de factorisation clairsemée.

Si vos matrices sont les représentations de graphiques, vous pouvez également considérer METIS avec la combinaison de CHOLMOD. Ce qui signifie que vous serez en mesure de faire partition/domainDecomposition dans les graphiques puis résoudre en parallèle avec CHOLMOD.

SuiteSparse est un outil puissant avec le soutien des solveurs linéaires (KLU) et directs.

Voici les GitHub link, UserGuide et SuiteSparse's home page