我实际上正在尝试使用C ++ lib Eigen解决大型稀疏线性系统。
稀疏矩阵是从此page中获取的。每个系统都具有以下结构:ConstrainedBox
,其中Ax = b
是稀疏矩阵(nxn),A
计算为b
,其中维度为n的A*xe
向量仅包含零。计算xe
之后,我需要计算x
和xe
之间的相对误差。我已经写了一些代码,但是我不明白为什么在计算结束时相对误差如此之高(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;
}
。它是一个对称的正定矩阵。谁能帮助我解决问题?预先感谢您的帮助。
答案 0 :(得分:0)
根据this page,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";