【问题标题】:Large sparse linear system solving with SimplicialCholesky Eigen使用 SimplicialCholesky Eigen 求解大型稀疏线性系统
【发布时间】:2019-04-09 12:09:46
【问题描述】:

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

#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;
    
}

矩阵ex15可以从这个page下载。它是一个对称的正定矩阵。谁能帮我解决这个问题?提前感谢您的帮助。

【问题讨论】:

  • 你有没有在一个更简单的矩阵上测试过这个,结果是已知的,预期的结果?
  • 嗨 Scott,ex15 矩阵是一个非常简单的稀疏矩阵。我使用 Matlab 对同一系统的解决方案作为基准。

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


【解决方案1】:

根据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";

【讨论】:

  • 感谢您的回答!也许我没有很好地解释我的问题。我的代码成功计算了所有步骤,但不幸的是我得到了一个太高的错误。我也无法理解 'cout
  • 您是否 100% 确定 chol.info() 会返回 Success?你正在尝试解决Ax=b,所以||Ax-b|| 是残差,也就是错误,||Ax-b||/||b|| 是相对错误。如果它足够小,比如双倍的 1e-15,那么你就得到了一个数字有效的解决方案。
  • 好的,我刚试过,SimplicialLDLT::info() 确实在数值分解后返回 NumericalIssue,因为 ex15 在数值上不是满秩。此外,ex15.mtx 仅存储下半三角形,因此您必须使用 mat.selfadjointView&lt;Lower&gt;() * vector 将其应用于向量。
  • 非常感谢您的解释!有了你的最后评论,我成功地实现了我的目标。我还有一个问题要问你。我如何理解 .mtx 是否仅存储矩阵的一半?谢谢你的好意。
猜你喜欢
  • 2023-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-25
  • 1970-01-01
  • 2015-08-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多