Я пытаюсь решить очень большую и разреженную систему линейных уравнений в C++. В настоящее время я использую BiCGSTAB от собственного. Он отлично работает для небольшой матрицы, но для матрицы требуемого размера требуется слишком много времени, что составляет 40804x40804 (в будущем это может быть даже больше).C++ Как решить очень большую систему разреженной линейной системы
У меня есть очень длинный сценарий, но я просто использовал следующий формат:
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);
Это занимает слишком много времени! И да, решение действительно существует. Редкая функция в Matlab, похоже, справляется с этим очень хорошо, но мне нужно это на C++ для подключения к серверу.
Я был бы очень признателен, если бы вы могли мне помочь!
Если сделать MATLAB хорошую работу для вас, почему бы не использовать его в C++. [Ссылка] (https://www.mathworks.com/help/matlab/matlab_external/calling-matlab-software-from-ac-application.html) – Logman
Если подключение к серверу имеет решающее значение, возможно, вам стоит попробовать pari/gp вместо ... – jaroslawj
Удостоверьтесь в компиляции с оптимизацией компилятора ON, тогда вы также можете попробовать прямой решатель, такой как 'Eigen :: SparseLU' (просто замените' BiCGSTAB' на 'SparseLU') или с помощью preconditioner' IncompleteLUT' в BICGSTAB. – ggael