首页 > 解决方案 > 特征稀疏求解器为同一线性系统提供截然不同的解决方案

问题描述

我正在尝试使用特征尽快解决稀疏线性系统。

文档为您提供了 4 个稀疏求解器(但实际上它更像这三个):

SimplicialLLT
#include<Eigen/SparseCholesky>  Direct LLt factorization    SPD Fill-in reducing    LGPL    

SimplicialLDLT is often preferable

SimplicialLDLT
#include<Eigen/SparseCholesky>  Direct LDLt factorization   SPD Fill-in reducing    LGPL    

Recommended for very sparse and not too large problems (e.g., 2D Poisson eq.)

SparseLU
#include<Eigen/SparseLU>    LU factorization    Square  Fill-in reducing, Leverage fast dense algebra   MPL2    

optimized for small and large problems with irregular patterns 

当我使用最后一个求解器时,即我这样做:

Eigen::SparseLU<Eigen::SparseMatrix<Scalar>> solver(bijection);
Assert(solver.info() == Eigen::Success, "Matrix is degenerate.");
solver.compute(bijection);
Assert(solver.info() == Eigen::Success, "Matrix is degenerate.");

Eigen::VectorXf vertices_u = solver.solve(u);
Assert(solver.info() == Eigen::Success, "Matrix is degenerate.");
Eigen::VectorXf vertices_v = solver.solve(v);
Assert(solver.info() == Eigen::Success, "Matrix is degenerate.");

我得到了正确的结果,其图形如下所示:

在此处输入图像描述

如果我使用 simplicialLDLT,即如果我更改求解器行而不是其他任何内容:

Eigen::SimplicialLDLT<Eigen::SparseMatrix<Scalar>> solver(bijection);

我得到了这个堕落的怪物:

在此处输入图像描述

基本上,这两个求解器为完全相同的稀疏系统返回了截然不同的结果。这怎么可能?

没有任何错误检查返回 false,因此在两个版本中,矩阵都被认为是好的。

标签: c++mathgeometrylinear-algebraeigen

解决方案


推荐阅读