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!
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
Si la connexion à un serveur est cruciale, vous devriez peut-être essayer plutôt pari/gp ... – jaroslawj
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