代码之家  ›  专栏  ›  技术社区  ›  K.iss

如何求解稀疏矩阵的线性方程AX=b

  •  3
  • K.iss  · 技术社区  · 7 年前

    我有稀疏矩阵A(120000*120000)和向量b(120000),我想用特征库求解线性系统AX=b。我试着按照文档进行操作,但总是出现错误。我还尝试将矩阵改为稠密矩阵并求解系统

        Eigen::MatrixXd H(N,N);
        HH =Eigen:: MatrixXd(A);
        Eigen::ColPivHouseholderQR<Eigen::MatrixXd> dec(H);
        Eigen::VectorXd RR = dec.solve(b);  
    

    但我有一个记忆错误。 请帮我找到解决这个问题的方法。

    1 回复  |  直到 7 年前
        1
  •  2
  •   Paul Floyd    6 年前

    对于稀疏系统,我们通常使用 迭代的 方法。一个原因是像鲁这样的直接求解者。。。因子分解填充初始矩阵(填充的意义是初始零分量被非零分量替换)。在大多数情况下 密集矩阵 无法再放入内存(-> 您的内存错误 ). 简而言之,迭代求解器不会改变稀疏模式,因为它们只涉及矩阵向量积(无填充)。

    也就是说,您必须首先知道您的系统是否 对称正定 (又名SPD)在这种情况下,您可以使用 conjugate gradient method . 否则,必须使用非对称系统的方法,如 BiCGSTAB GMRES .

    你必须知道,大多数时候我们使用 preconditioner ,尤其是当您的系统处于病态状态时。

    查看我发现的特征doc(没有预条件afaik的示例):

      int n = 10000;
      VectorXd x(n), b(n);
      SparseMatrix<double> A(n,n);
      /* ... fill A and b ... */ 
      BiCGSTAB<SparseMatrix<double> > solver;
      solver.compute(A);
      x = solver.solve(b);
      std::cout << "#iterations:     " << solver.iterations() << std::endl;
      std::cout << "estimated error: " << solver.error()      << std::endl;
    

    这可能是一个好的开始(如果矩阵是SPD,则使用共轭梯度法)。注意,这里没有预条件,因此收敛速度肯定会很慢。

    概述:大矩阵->迭代法+预条件器。

    这真的是第一个“基本/天真”的解释,你可以在 Saad's book: Iterative Methods for Sparse Linear Systems . 同样,这个话题很大,你可以找到很多其他关于这个主题的书。

    我不是特征用户,但是有 precondtioners here . -&燃气轮机;不完全LU(非对称系统)或不完全Cholesky(SPD系统)通常是良好的通用预条件,需要首先进行测试。