0

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

#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可以从这个页面下载。它是一个对称的正定矩阵。谁能帮我解决这个问题?预先感谢您的帮助。

4

1 回答 1

0

根据这个页面ex15不是满级。您应该检查每个步骤是否顺利:

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";
于 2019-04-09T19:54:37.457 回答