用SimplicialCholesky特征值求解大型稀疏线性系统

时间:2019-04-09 12:09:47

标签: c++ sparse-matrix linear-algebra eigen

我实际上正在尝试使用C ++ lib Eigen解决大型稀疏线性系统。 稀疏矩阵是从此page中获取的。每个系统都具有以下结构:ConstrainedBox,其中Ax = b是稀疏矩阵(nxn),A计算为b,其中维度为n的A*xe向量仅包含零。计算xe之后,我需要计算xxe之间的相对误差。我已经写了一些代码,但是我不明白为什么在计算结束时相对误差如此之高(1.49853e + 08)。

x

可以从此page下载矩阵#include <iostream> #include <Eigen/Dense> #include <unsupported/Eigen/SparseExtra> #include<Eigen/SparseCholesky> #include <sys/time.h> #include <sys/resource.h> using namespace std; using namespace Eigen; int main() { SparseMatrix<double> mat; loadMarket(mat, "/Users/anto/Downloads/ex15/ex15.mtx"); VectorXd xe = VectorXd::Constant(mat.rows(), 1); VectorXd b = mat*xe; SimplicialCholesky<Eigen::SparseMatrix<double> > chol(mat); VectorXd x = chol.solve(b); double relative_error = (x-xe).norm()/(xe).norm(); cout << relative_error << endl; }。它是一个对称的正定矩阵。谁能帮助我解决问题?预先感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

根据this pageex15排名不高。您应该检查每个步骤是否顺利:

SimplicialLDLT<Eigen::SparseMatrix<double> > chol(mat);
if(chol.info()!=Eigen::Success)
  return;
VectorXd x = chol.solve(b); 
if(chol.info()!=Eigen::Success)
  return;

,然后检查您是否获得了一个解决方案(如果不是完整等级,并且至少存在一个解决方案,则存在整个解决方案子空间):

cout << (mat*x-b).norm()/b.norm() << "\n";